2011-09-29 7 views
3

私は約250,000レコードのSQLテーブルを検索し、2つのフィールドのみを検索するLINQクエリを持っています。両方のフィールドにインデックスが付けられていますが、私はまだそれがかなり遅いと感じています。LINQクエリをスピードアップするためのヒント?

コードは以下のとおりです。スピードアップに役立つものは誰にでもありますか?

おかげ

var qryN = (
    from bn in dbs.Uploads 
    orderby bn.ID descending 
    select new 
    { 

     ID = bn.ID, 
     Serial = bn.serial_no, 
     Manufacturer = bn.Mfgr, 
     Model = bn.model, 
     Code = bn.code, 
     Qty = bn.qty, 
     Description = bn.description, 
     Comments = bn.comments, 
     Location = bn.location, 
     Price = bn.price, 
     Email = "Register/Login for full details" 
    }); 

if (dlType.Text != " " && dlType.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue); 
} 

if (txtWord.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 
    } 

gvLoggedOff.DataSource = 
    from p in qryN 
    select new 
    { 
     p.ID, 
     p.Serial, 
     p.Manufacturer, 
     p.Model, p.Code, 
     p.Qty, 
     p.Description, 
     p.Comments, 
     p.Location, 
     p.Price, 
     p.Email 
    }; 

gvLoggedOff.DataBind(); var qryN = (
    from bn in dbs.Uploads 
    orderby bn.ID descending 
    select new 
    { 

     ID = bn.ID, 
     Serial = bn.serial_no, 
     Manufacturer = bn.Mfgr, 
     Model = bn.model, 
     Code = bn.code, 
     Qty = bn.qty, 
     Description = bn.description, 
     Comments = bn.comments, 
     Location = bn.location, 
     Price = bn.price, 
     Email = "Register/Login for full details" 
    }); 

if (dlType.Text != " " && dlType.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue); 
} 

if (txtWord.Text != "") 
{ 
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 
    } 

gvLoggedOff.DataSource = 
    from p in qryN 
    select new 
    { 
     p.ID, 
     p.Serial, 
     p.Manufacturer, 
     p.Model, p.Code, 
     p.Qty, 
     p.Description, 
     p.Comments, 
     p.Location, 
     p.Price, 
     p.Email 
    }; 

gvLoggedOff.DataBind(); 
+5

生成されたSQLを見て、それをプロファイルしましたか? –

+1

「製造業者」にはFKがありますか? –

+0

Jonは絶対に正しいです。あなたの質問は現在非常に曖昧です。私たちは、LINQ to SQL、Entity Framework、Hibernateなどを使用しているかどうか、データモデルの見た目、生成される内容、そしてそれが何であるかはわかりません。 – Steven

答えて

1

2つのこと:

  • あなたはフィルタを追加しているので、代わりに最初の最後の行に(新しい匿名型に選択する)投影を移動し、DataSourceライン。
  • ご注文は非常に早いです。クエリ可能またはクエリアナライザがこれを分析して最適化するほどスマートでない限り、データベースはフィルタ処理を開始する前に250,000行を注文する必要があります。可能な限り遅く、おそらく投影が行われる直前に注文を移動してください。これは答えとして受け入れられたので

    var qryN = dbs.Uploads.AsQueryable(); 
    
    if (dlType.Text != " " && dlType.Text != "") 
        qryN = qryN.Where(bn => bn.Mfgr == dlType.SelectedValue); 
    
    if (txtWord.Text != "") 
        qryN = qryN.Where(bn => bn.description.Contains(txtWord.Text)); 
    
    gvLoggedOff.DataSource = qryN.OrderByDescending(bn => bn.ID) 
        .Select(bn => new { 
         bn.ID, Serial = bn.serial_no, Manufacturer = bn.Mfgr, 
         Model = bn.model, Code = bn.code, Qty = bn.qty, 
         Description = bn.description, Comments = bn.comments, 
         Location = bn.location, Price = bn.price, 
         Email = "Register/Login for full details" }); 
    
    gvLoggedOff.DataBind(); 
    

    :テキスト検索についてSteven's answerは、いくつかの状況では、おそらくも適用可能である。ここ

はあなたのサンプルを修正するに短い試みです。フルテキスト検索は、あなたが信じられないようなパフォーマンスを排除することができます。

qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text)); 

Contains呼び出しはSQL description LIKE '%' + @p0 + '%'に変換:

+0

うん、私はそれを認識しています。私はあなたのソリューションを採用し、スティーブンスを1つのフィールドのための場所に置いて、結果は素晴らしいです - ありがとう – DarkW1nter

+0

@ペドロ:ああ、確かに、私は "それをしないでください"と言っているわけではない、それ"。 – Jesper

+0

1つのマイナーな追加: 'if(dlType.Text!=" "&& dlType.Text!=" ")'はif(!string.IsNullOrWhiteSpace(dlType.Text)) 'となります。 –

7

Description上のフィルタが問題である可能性があります。これは、たとえあなたがdescription列にインデックスを持っていても、SQL Serverは完全なインデックス(または完全なテーブル)をループする必要があることを意味します。可能な場合は、次のように行を変更します。

qryN = qryN.Where(bn => bn.Description.StartsWith(txtWord.Text)); 

を。これは、データベースサーバーが効果的にインデックスを使用することができますdescription LIKE @p0 + '%'に変換します。

1

Description.Contains音が重い場合は、代わりに全文検索を使用してみてください。

Hereは、LINQからFTSを使用する方法を説明する記事です。

関連する問題