【问题标题】:Performance slowdown when using Unicode collations使用 Unicode 排序规则时性能下降
【发布时间】:2009-04-02 04:22:41
【问题描述】:

(.NET 3.5 SP1,VS 2008,VB.NET,MSSQL Server 2008)

我正在编写一个小型网络应用程序来测试高棉 Unicode 和老挝 Unicode。我有一个表格,以高棉 Unicode 存储文本,结构如下:

[t_id] [int] IDENTITY(1,1) NOT NULL
[t_chid] [int] NOT NULL
[t_vn] [int] NOT NULL
[t_v] [nvarchar](max) NOT NULL

我可以正常使用 Linq to SQL 进行 CRUD。即使我没有更改 MSSQL Server 2008 的默认排序规则,文本也会在网页上正常显示。

当搜索列 [t_v] 时,页面将需要很长时间才能加载,事实上,它会加载该列的每一行。它从不与我用于搜索的“关键字”标准进行比较。这是我的搜索查询:

Public Shared Function SearchTestingKhmerTable(ByVal keyword As String) As DataTable

    Dim db As New BibleDataClassesDataContext()
    Dim query = From b In db.khmer_books _
                From ch In db.khmer_chapters _
                From v In db.testing_khmers _
                Where v.t_v.Contains(keyword) And ch.kh_book_id = b.kh_b_id And v.t_chid = ch.kh_ch_id _
                Select b.kh_b_id, b.kh_b_title, ch.kh_ch_id, ch.kh_ch_number, v.t_id, v.t_vn, v.t_v


    Dim dtDataTableOne = New DataTable("dtOne")
    dtDataTableOne.Columns.Add("bid", GetType(Integer))
    dtDataTableOne.Columns.Add("btitle", GetType(String))
    dtDataTableOne.Columns.Add("chid", GetType(Integer))
    dtDataTableOne.Columns.Add("chn", GetType(Integer))
    dtDataTableOne.Columns.Add("vid", GetType(Integer))
    dtDataTableOne.Columns.Add("vn", GetType(Integer))
    dtDataTableOne.Columns.Add("verse", GetType(String))

    For Each r In query
        dtDataTableOne.Rows.Add(New Object() {r.kh_b_id, r.kh_b_title, r.kh_ch_id, r.kh_ch_number, r.t_id, r.t_vn, r.t_v})
    Next
    Return dtDataTableOne


End Function

请注意,我使用与老挝 Unicode 完全相同的代码和数据库设计,它工作得很好。我得到了搜索预期的返回查询。

我无法弄清楚在高棉表中搜索查询的问题。


我使用以下 Linq 加入表格:

Dim query = From b In db.khmer_books _
    Join ch In db.khmer_chapters On b.kh_b_id Equals ch.kh_book_id _
    Join v In db.testing_khmers On ch.kh_ch_id Equals v.t_chid _
    Where v.t_v.Contains(keyword) _
    Select b.kh_b_id, b.kh_b_title, ch.kh_ch_id, ch.kh_ch_number, v.t_id, v.t_vn, v.t_v

但我仍然得到了该表中的所有行。任何的想法 ?非常感谢。

【问题讨论】:

    标签: .net asp.net sql-server linq-to-sql


    【解决方案1】:

    我很慢;问题是(我认为)连接;你有导航属性吗?你应该可以使用类似的东西

             from book in db.Books
             from chapter in book.Chapters
             from verse in chapter.Verses
    

    等 - 或(最坏情况)使用 LINQ join 语法。我认为这将比复合 WHERE 好得多;像这样:

        From b In db.khmer_books
        Join ch In db.khmer_chapters On b.kh_b_id Equals ch.kh_book_id Into ch
        Join v In db.testing_khmers On ch.kh_ch_id Equals v.t_chid Into v
        Where v.t_v.Contains(keyword)
       {your select}
    

    原文:

    首先要做的是获取生成的查询;您可以在运行查询之前分配db.Log = Console.Out,这会将TSQL 推送到控制台(或者您可以使用任何其他TextWriter)。我很想看看它会产生什么......

    然后您可以在数据库(管理工作室)中测试这个 TSQL,看看它出现了什么可怕的错误。

    在最坏的情况下,您可以编写一个 UDF 来进行搜索(使用固定的 TSQL),然后从 LINQ-to-SQL 调用它。

    你能发布 TSQL 吗?

    【讨论】:

    • 导航属性 ?我不明白这个。你介意给我一个关于这个问题的 LINQ 连接语法的代码块吗?非常感谢您的意见。
    【解决方案2】:

    这是我从 SqlServerQueryVisualizer 获得的 TSQL:

    SELECT [t0].[kh_b_id], [t0].[kh_b_title], [t1].[kh_ch_id], [t1].[kh_ch_number], [t2].[t_id], [t2].[t_vn], [t2].[t_v]
    FROM [dbo].[khmer_book] AS [t0], [dbo].[khmer_chapter] AS [t1], [dbo].[testing_khmer] AS [t2]
    WHERE ([t2].[t_v] LIKE '%ដាវីឌ%') AND ([t1].[kh_book_id] = [t0].[kh_b_id]) AND ([t2].[t_chid] = [t1].[kh_ch_id])
    

    我在managment studio中运行它,即使表格中有ដាវីឌ,我也没有得到任何东西。

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2012-02-22
      • 2015-09-21
      • 1970-01-01
      • 2020-02-05
      • 2011-11-07
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多