2009-04-02 9 views
0

(.NET 3.5 SP1, VS 2008, VB.NET, MSSQL Server 2008)Leistung Verlangsamung bei der Verwendung von Unicode-Sortierungen

Ich bin einen kleinen Web-App des Schreiben des Khmer Unicode und Lao Unicode zu testen. Ich habe eine Tabelle, den Text in Khmer Unicode mit folgenden Struktur speichern:

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

ich Linq verwenden kann, um SQL CRUD normalerweise zu tun. Der Text wird auf der Webseite korrekt angezeigt, obwohl ich die Standardsortierung von MSSQL Server 2008 nicht geändert habe.

Wenn die Spalte [t_v] durchsucht wird, dauert das Laden der Seite sehr lange Tatsächlich lädt es jede Zeile dieser Spalte. Es wird niemals mit den "Schlüsselwort" -Kriterien verglichen, die ich für die Suche verwende. Hier ist meine Abfrage für die Suche:

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 

Bitte beachten Sie, dass ich das exakt gleichen Code und Datenbank-Design mit Lao Unicode verwenden und es funktioniert gut. Ich bekomme die zurückgegebene Abfrage wie erwartet für die Suche.

Ich kann nicht herausfinden, was das Problem mit der Suche nach Abfrage in Khmer-Tabelle.


ich verwendet, um die folgende Linq den Tisch zu kommen:

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 

Aber ich habe immer noch alle Zeilen aus dieser Tabelle. Irgendeine Idee ? Danke vielmals.

Antwort

0

Ich war langsam; das Problem ist (denke ich) die Joins; Hast du Navigationseigenschaften? Sie sollten in der Lage sein, etwas zu verwenden, wie

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

usw. - oder (worst case) verwenden, um die LINQ join Syntax. Ich denke, das wird deutlich besser funktionieren als das Composite WHERE; so wie:

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} 

original:

Das erste, was zu tun ist, um die erzeugte Abfrage zu erhalten; Sie können db.Log = Console.Out zuweisen, bevor Sie die Abfrage ausführen. Dadurch wird die TSQL auf die Konsole übertragen (oder Sie können eine beliebige andere TextWriter verwenden). Ich wäre sehr interessiert zu sehen, was es erzeugt ...

Sie können dann diese TSQL in der Datenbank (Management Studio) testen, um zu sehen, was es so schrecklich falsch ist.

Im schlimmsten Fall könnten Sie eine UDF für die Suche schreiben (mit festem TSQL) und diese von LINQ-to-SQL aufrufen.

Können Sie die TSQL bitte posten?

+0

Navigationseigenschaften? Ich verstehe das nicht. Würde es Ihnen etwas ausmachen, mir einen Code-Block für LINQ Join-Syntax für dieses Problem zu geben. Vielen Dank für die Eingabe. –

0

Hier ist der T-SQL, die ich von SqlServerQueryVisualizer bekam:

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

ich dies in Managment Studio laufen und ich habe nichts selbst bekommen, obwohl es ដាវីឌ in der Tabelle ist.

+0

d'oh! gefunden - siehe Update –

+0

aktualisiert und kommentiert –

Verwandte Themen