1

以下查询在 SQL Server 2008R2 中针对 ItemData 表的存储过程中运行:

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

根据查询使用的数据CONTAINSFREETEXT

在负载情况下,此查询运行速度非常慢,并且以 100% 的速度查看服务器。

我设置了以下索引:

在此处输入图像描述

我需要怎么做才能使这些查询停止运行这么热?

谢谢。

- 更新 -

该表有一个仅由 ItemListID 和标题和描述上的 FTS 组成的聚集索引。

我添加了一个非聚集索引(在身份名称中错误地命名),如下所示:

非聚集索引

4

1 回答 1

0

在没有实际查看执行计划的情况下,您似乎需要一个关于 Title、GeoCity、GeoState 和 WebsiteID 的非聚集索引,其中包含以下列:ItemListID、GeoDisplay、Link、Description、CleanDescription、OptimizedDescription、PubDateParsed、ImageBytes、DateAdded

这将允许执行计划使用包含您在此查询中查找的所有信息的一个非聚集索引。没有它,它将使用您显示的索引之一,并且仍然必须去表中获取您需要的数据。

但是,这并不能完全解决您的问题,具体取决于您的表中有多少数据,执行包含标题进行搜索总是很昂贵。如果您可以利用全文搜索来完成搜索部分,那将是最好的。

希望这会有所帮助!

于 2012-08-09T01:25:15.093 回答