次のクエリは、SQL Server 2008R2 の ItemData テーブルを対象とする sproc で実行されます。
SELECT TOP(500) ItemListID, GeoCity, GeoState, GeoDisplay, Title, Link, Description, CleanDescription, OptimizedDescription, PubDateParsed, ImageBytes, DateAdded FROM ( SELECT TOP(500) ItemListID, GeoCity, GeoState, GeoDisplay, Title, Link, Description, CleanDescription, OptimizedDescription, PubDateParsed, ImageBytes, DateAdded, ROW_NUMBER()
OVER( ORDER BY ItemListID DESC )
AS RowNumber
FROM ItemData
WHERE CONTAINS(Title, @FTSSearchTerm ) -- ' + @OriginalSearchTerm + '"')
AND ( WebsiteID=1 AND
(@GeoCity = '-1' OR GeoCity = @GeoCity) AND
(@GeoState = '-1' OR GeoState = @GeoState) )
) ItemData WHERE RowNumber >= ( @PageNum - 1) * @PageSize + 1 AND RowNumber <= @PageNum * @PageSize ORDER BY ItemListID DESC
SELECT @NumberOfResultsReturned = @@ROWCOUNT
SELECT @ActualNumberOfResults = COUNT(*) FROM ItemData WHERE CONTAINS(Title, @FTSSearchTerm ) -- ' + @OriginalSearchTerm + '"') AND ( WebsiteID=1 AND (@GeoCity = '-1' OR GeoCity = @GeoCity) AND (@GeoState = '-1' OR GeoState = @GeoState) )
データに応じて、クエリで または のいずれCONTAINS
かが使用されますFREETEXT
。
負荷がかかると、このクエリの実行は非常に遅くなり、サーバーは 100% でピークになります。
次のインデックスを設定しました。
これらのクエリが非常にホットに実行されないようにするには、どうすればよいですか?
ありがとう。
- アップデート -
このテーブルには、ItemListID と、タイトルと説明の FTS のみで構成される 1 つのクラスター化インデックスがあります。
次のように、非クラスター化インデックス (ID 名に誤って名前が付けられています) を追加しました。