使用Unicode排序规则时性能下降

时间:2009-04-02 04:22:42

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

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

我正在编写一个小型网络应用程序来测试高棉语Unicode和老挝语。我有一个表格,用Khmer 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

请注意,我使用与Lao 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

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

2 个答案:

答案 0 :(得分:0)

我很慢;问题是(我认为)加入;你有导航属性吗?你应该能够使用像

这样的东西
         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吗?

答案 1 :(得分:0)

这是我从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])

我在管理工作室运行这个,即使表中有ដាវីឌ,我也没有得到任何东西。