如何使以下SQL查询以100%运行我的服务器?

时间:2012-08-09 00:34:07

标签: tsql sql-server-2008-r2 query-optimization

以下查询在针对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%的速度查看服务器。

我设置了以下索引:

enter image description here

我需要做什么才能使这些查询停止运行如此热门?

感谢。

- 更新 -

该表有一个聚簇索引,它只包含ItemListID,以及Title和Description上的FTS。

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

Non-clustered indexes

1 个答案:

答案 0 :(得分:0)

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

这将允许执行计划使用包含您在此查询中查找的所有信息的一个非聚集索引。没有它,它将使用您展示的其中一个索引,但仍然必须转到表中以获取所需的数据。

这不会完全解决您的问题,具体取决于您的表中有多少数据,执行标题包含以进行搜索将始终是昂贵的。如果您可以利用full text searching来执行搜索部分,那将是最好的。

希望这有帮助!