2011-03-29 120 views
0

嘿傢伙, 我有一個查詢在sql服務器需要至少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 

我認爲這可以通過使用包括使用這些列的索引來解決。我檢查了網,但沒有找到任何解決辦法..

如果我能得到幫助,同樣我將不勝感激。 感謝和問候 Abbas Electricwala

+0

您需要查看全文索引。您正在對錶上最寬的3列進行主導通配符搜索,因此聚簇索引掃描是此查詢唯一合理的計劃/索引。 'CrossArticle_Article'中有多少行? – 2011-03-29 14:59:49

+0

@Martin:在crossarticle_article中有大約22000條記錄。你能告訴我如何使用全文索引來解決這個問題 – Abbas 2011-03-29 15:07:29

回答

1

不幸的是,普通列索引很可能無法幫助您查詢。 LIKE條件只能在索引爲value%(意味着您只能在表達式的結尾處具有通配符;前綴必須是靜態的)時才由索引協助。

我假設你已經有一個索引CrossArticle_Article.IdCrossArticle_ArticleToCategory.ArticleId。如果不是,你應該添加這些。

+0

感謝您的回覆,是的,我對這兩個領域都有主鍵索引,並且如果我在表達式的末尾使用通配符,我該如何做性能更好.. – Abbas 2011-03-29 15:06:08

+0

@Abbas:如果表達式末尾只有一個通配符,那麼在'Title','Summary'和'Article'上添加一個索引應該會有所幫助。 – 2011-03-29 15:12:32