【问题标题】:How to keep the following TSQL query from running my server at 100%?如何防止以下 SQL 查询以 100% 的速度运行我的服务器?
【发布时间】:2012-08-09 00:34:07
【问题描述】:

以下查询在 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 以及 Title 和 Description 上的 FTS 组成。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    但这并不能完全解决您的问题,具体取决于您的表中有多少数据,使用“包含标题”来进行搜索总是很昂贵。最好能利用full text searching 来进行搜索部分。

    希望这会有所帮助!

    【讨论】:

    • 好的,所以我应该删除当前索引(PK 除外),然后添加一个包含您提到的字段的非聚集索引?您提到使用 CONTAINS 很昂贵(在 Title 上),但我已经在 Title 和 Description 上创建了一个全文索引(后者我目前没有在我的查询中使用)。我注意到我的属性中没有计划 - 我需要添加一些自动填充计划吗?
    • 我不能说您应该在不了解系统其余部分如何与数据库交互的情况下删除任何索引。但是,您可以使用 Glenn Berry 的一些很棒的查询来帮助您调整索引。 sqlserverperformance.wordpress.com/tag/dmv-queries
    • 至于全文搜索,厉害!那么据我所知,您不需要再做任何事情了。
    • 谢谢。我尝试使用 ItemDataID 创建聚集索引。但是,因为我的 FTS 中有 Title 和 Description,所以它们不能包含在聚集索引中。没关系。但是,我收到一条警告消息,指出 PK 上的当前索引需要保留为单列,否则 FTS 将被禁用。简而言之 - 是否可以在您提到的字段上创建聚集索引,不包括 PK 有效地执行您推荐的操作?
    • 我建议您创建一个非聚集索引。此时我会单独保留从 PK 生成的聚集索引。
    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2012-04-02
    • 2016-02-29
    相关资源
    最近更新 更多