2009-04-02 7 views
0

classements (.NET 3.5 SP1, VS 2008, VB.NET, MSSQL Server 2008)ralentissement des performances lors de l'utilisation Unicode

J'écris une petite application Web pour tester les Khmers Unicode et Lao Unicode. J'ai une table qui stockent du texte en Unicode Khmer avec la structure suivante:

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

Je peux utiliser LINQ to SQL pour faire CRUD normalement. Le texte s'affiche correctement sur la page Web, même si je n'ai pas modifié le classement par défaut de MSSQL Server 2008.

En ce qui concerne la recherche dans la colonne [t_v], la mise en charge de la page prend beaucoup de temps. en fait, il charge chaque rangée de cette colonne. Il ne se compare jamais au critère «mot clé» que j'utilise pour la recherche. Voici ma requête pour la recherche:

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 

S'il vous plaît noter que j'utilise la conception exacte même code et la base de données avec Lao Unicode et il fonctionne très bien. Je reçois la requête renvoyée comme prévu pour la recherche.

Je ne peux pas comprendre quel est le problème avec la recherche de requête dans la table khmer.


J'ai utilisé la Linq suivante pour se joindre à la table:

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 

Mais j'ai toujours toutes les lignes de cette table. Une idée ? Merci beaucoup.

Répondre

0

J'étais lent; le problème est (je pense) les jointures; avez-vous des propriétés de navigation? Vous devriez être en mesure d'utiliser quelque chose comme

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

etc - ou (pire cas), utilisez la syntaxe LINQ join. Je pense que cela fonctionnera nettement mieux que le composite WHERE; comme ceci:

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} 

d'origine:

La première chose à faire est d'obtenir la requête générée; vous pouvez affecter db.Log = Console.Out avant d'exécuter la requête, ce qui va pousser le TSQL vers la console (ou vous pouvez utiliser n'importe quel autre TextWriter). Je serais très intéressé de voir ce qu'il génère ...

Vous pouvez ensuite tester ce TSQL à la base de données (studio de gestion) pour voir ce qui se passe si horriblement mal. Dans le pire des cas, vous pouvez écrire un UDF pour faire la recherche (avec TSQL fixe), et l'appeler de LINQ-to-SQL.

Pouvez-vous publier le TSQL s'il vous plaît?

+0

propriétés de navigation? Je ne comprends pas ça. Pourriez-vous me donner un bloc de code pour la syntaxe de jointure LINQ sur ce problème. Merci beaucoup pour l'apport. –

0

Voici le TSQL que je suis arrivé de 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]) 

Je lance ce en studio managment et je n'ai rien même si il y a ដាវីឌ dans le tableau.

+0

d'oh! trouvé - voir mise à jour –

+0

mis à jour re comment –

Questions connexes