【问题标题】:Query creates load on sql server查询在 sql server 上创建负载
【发布时间】:2016-02-23 10:59:20
【问题描述】:

我已经查询了

Select         
-- Generate the row number        
ROW_NUMBER() over(order by MenuOrder) as 'rownum',        
-- get the minimum data from query        
(Select top 1 ROW_NUMBER()over(order by MenuOrder)          
from SitePage where ActiveFlag='true' AND SiteId=1083 and LanguageId=159 AND ChildOf=0 order by MenuOrder asc) as 'min',        
-- get the maximum data from query        
(Select top 1 ROW_NUMBER()over(order by MenuOrder)  from SitePage where ActiveFlag='true' and LanguageId=159 AND SiteId=1083 AND ChildOf=0         
order by MenuOrder desc) as 'max',        
-- get rest of all details        
*,(case when exists(select *from SitePage where ChildOf = AP.SitePageId and ActiveFlag =1  ) then 'Y' else 'N' end) as [Type]  from SitePage AP 
where ActiveFlag=1 AND SiteId=1083 AND ChildOf=0 and LanguageId=159 order by MenuOrder

在那之后,当我看到查询性能时,它需要很长时间才能执行,这会在 sql server 上产生负载,导致服务器意外停机

这里是 total_elapsed_time_in_Seconds:61480

如何减少 total_elapsed_time_in_Seconds

【问题讨论】:

  • 您应该查看执行计划。这些表上有索引吗?而且我不确定“min”子查询是否可以返回与 1 不同的东西。你能澄清“min”和“max”子查询的作用吗?为什么不排名第一,为什么MenuOrder 不符合您的需求。查看ActiveFlag 字段使用情况:它是数字/微小还是varchar?

标签: sql sql-server performance optimization query-optimization


【解决方案1】:

你可以通过重构来改进你的查询,例如你正在执行一个完整的查询来获得最小值ROW_NUMBER(),这将始终是 1。同样,不需要单独的子查询来获得最大值,因为过滤器完全相同,您可以在主查询中使用COUNT(*) OVER()

接下来你应该做的就是不要使用SELECT *,而只返回你需要的列,即使这就是它们的全部still good practise to state all the columns

SELECT  RowNum = ROW_NUMBER() OVER(ORDER BY ap.MenuOrder),
        [Min] = 1,
        [Max] = COUNT(*) OVER(),
        [Type] = ISNULL(t.[Type], 'N'),
        ap.Column1,
        ap.Column2,
        ap.Column3
FROM    SitePage AS ap 
        OUTER APPLY
        (   SELECT  TOP 1 'Y'
            FROM    SitePage AS ap2
            WHERE   ap2.ChildOf = ap.SitePageID
            AND     ap2.ActiveFlag = 1
        ) AS t ([Type])
WHERE   ap.ActiveFlag = 1 
AND     ap.SiteId = 1083 
AND     ap.ChildOf = 0 
AND     ap.LanguageId = 159 
ORDER BY ap.MenuOrder;

这应该已经提高了性能,但索引很可能会进一步改善这一点。在不知道您的数据的情况下很难知道最佳索引是什么,但一个好的开始是在 SSMS 中启用“显示实际执行计划”运行,然后这将为您建议索引。这绝不是一门精确的科学,但它应该能让你朝着正确的方向开始。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2017-11-06
    • 2015-11-17
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多