Снижение производительности при использовании параметров сортировки Unicode - PullRequest
0 голосов
/ 02 апреля 2009

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

Я пишу небольшое веб-приложение для тестирования кхмерского юникода и лаосского юникода. У меня есть таблица, которая хранит текст в кхмерском 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 голосов
/ 02 апреля 2009

Вот TSQL, который я получил от SqlServerQueryVisualizer:

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])

Я запускаю это в студии управления, но ничего не получил, хотя в таблице есть *.

0 голосов
/ 02 апреля 2009

Я был медленным; проблема в (я думаю) объединениях; у вас есть свойства навигации? Вы должны быть в состоянии использовать что-то вроде

         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, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...