2011-03-29 7 views
0

ちょっとguys、 SQL Serverで実行に最低10〜15秒かかるクエリがあります。これがasp.netで呼び出されると、最悪の場合は要求のタイムアウトがスローされますエラー。SQLサーバーのインデックス問題

以下は私が使用しているクエリです。

SELECT C.Id, 
     C.Summary, 
     C.Title, 
     C.Author, 
     CONVERT(VARCHAR(12), C.PublishDate, 104) 
     AS 'DATE', 
'/Article/' + SUBSTRING(dbo.RemoveSpecialChars(C.Title), 0, 10) + '/' + CAST(CA.CategoryId AS VARCHAR(MAX)) + '/' + CAST(C.Id AS VARCHAR(MAX)) + 
'.aspx' AS 
'URL' 
FROM CrossArticle_Article C 
     INNER JOIN CrossArticle_ArticleToCategory CA 
     ON C.Id = CA.ArticleId 
WHERE C.Title LIKE '%' + @KEYWORD + '%' 
     OR C.Summary LIKE '%' + @KEYWORD + '%' 
     OR C.Article LIKE '%' + @KEYWORD + '%' 


    SELECT @@ROWCOUNT 

下記はフィールド仕様です。

Id int Primary Key 
Summary nvarchar(1000) 
Title nvarchar(200) 
Author nvarchar(200) 
PublishDate DateTime 
CategoryId int PrimaryKey 

私はネット上で確認しますが、解決策を見つけるdidntの。これには、使用してこれらの列にインデックスを使用して解決することができると思います。..

私は同じのための助けを得ることができれば、私は感謝。 ありがとう、ありがとうございます。 Abbas Electricwala

+0

このためにはフルテキストインデックスを調べる必要があります。テーブルの3つの列でワイルドカード検索を実行しているため、クラスタ化インデックススキャンはこのクエリの唯一の合理的な計画/インデックス作成です。 'CrossArticle_Article'にはいくつの行がありますか? –

+0

@Martin:crossarticle_articleには約22000件のレコードがあります。私はこの問題を解決するためにフルテキストインデックスを使用する方法を教えてください – Abbas

答えて

1

普通の列の索引付けは、残念なことにあなたのクエリを助けることができません。 LIKEの条件は、value%という形式のインデックスでのみサポートされます。つまり、式の末尾にはというワイルドカードしか使用できません。接頭辞は静的でなければなりません。

私はあなたがすでにCrossArticle_Article.IdCrossArticle_ArticleToCategory.ArticleIdにインデックスを持っていることを前提としています。そうでない場合は、それらを追加する必要があります。

+0

あなたの返事をありがとう、ありがとう、両方のフィールドにプライマリキーインデックスがあります。より良いパフォーマンス。 – Abbas

+0

@Abbas:式の終わりにワイルドカードしかない場合は、 'Title'、' Summary'、 'Article'にインデックスを追加すると役立ちます。 –