sql - 优化 SQL 查询以避免哈希匹配(聚合)

标签 sql sql-server performance

我有一个 SQL 查询,需要 7 分钟以上才能返回结果。我尝试尽可能优化,但执行计划在哈希匹配(聚合)上损失了 82% 的时间。我已经进行了一些搜索,看起来使用“EXISTS”将有助于解决问题,但我还没有弄清楚查询的语法以使其工作。这是查询:

select dbo.Server.Name,
                dbo.DiskSpace.Drive,
                AVG(dbo.DiskSpace.FreeSpace) as 'Free Disk Space',
                AVG(dbo.Processor.PercentUsed) as 'CPU % Used',
                AVG(dbo.Memory.PercentUtilized) as '% Mem Used'

                from Server
                join dbo.DiskSpace on dbo.Server.ID=DiskSpace.ServerID
                join dbo.Processor on dbo.Server.ID=Processor.ServerID
                join dbo.Memory on dbo.Server.ID=dbo.Memory.ServerID

                where
                dbo.Processor.ProcessorNum='_Total' 
                    and dbo.Processor.Datetm>DATEADD(DAY,-(1),(CONVERT (date, GETDATE()))) 
                    and (      dbo.Server.Name='qp-ratking' 
                            or dbo.Server.Name='qp-hyper2012' 
                            or dbo.Server.Name='qp-hyped' 
                            or dbo.Server.Name='qp-lichking')
                Group By dbo.server.name, Dbo.DiskSpace.Drive
                Order By Dbo.Server.Name, dbo.DiskSpace.Drive;

如何使用 EXISTS 减少/消除连接?或者如果有更好的优化方法,我也愿意。谢谢

最佳答案

一位同事分解了查询并以较小的 block 提取数据,因此对连接返回的数据没有太多处理。它将返回时间缩短到不到 1 秒。新查询:

WITH tempDiskSpace AS
(
SELECT dbo.Server.Name
      ,dbo.DiskSpace.Drive
      ,AVG(dbo.DiskSpace.FreeSpace) AS 'Free Disk Space'

FROM dbo.DiskSpace
      LEFT JOIN dbo.Server ON dbo.DiskSpace.ServerID=Server.ID

WHERE dbo.DiskSpace.Datetm>DATEADD(DAY,-(1),(CONVERT (date, GETDATE())))
AND (dbo.Server.Name='qp-ratking'
      OR dbo.Server.Name='qp-hyper2012'
      OR dbo.Server.Name='qp-hyped'
      OR dbo.Server.Name='qp-lichking')

GROUP BY Name, Drive
)
,tempProcessor
AS
(
SELECT dbo.Server.Name
      ,AVG(dbo.Processor.PercentUsed) AS 'CPU % Used'

FROM dbo.Processor
      LEFT JOIN dbo.Server ON dbo.Processor.ServerID=Server.ID

WHERE dbo.Processor.Datetm>DATEADD(DAY,-(1),(CONVERT (date, GETDATE())))
AND dbo.Processor.ProcessorNum='_Total'
AND (dbo.Server.Name='qp-ratking'
      OR dbo.Server.Name='qp-hyper2012'
      OR dbo.Server.Name='qp-hyped'
      OR dbo.Server.Name='qp-lichking')

GROUP BY Name
)
,tempMemory
AS
(
SELECT dbo.Server.Name
      ,AVG(dbo.Memory.PercentUtilized) as '% Mem Used'

FROM dbo.Memory
      LEFT JOIN dbo.Server ON dbo.Memory.ServerID=Server.ID

WHERE dbo.Memory.Datetm>DATEADD(DAY,-(1),(CONVERT (date, GETDATE())))
AND (dbo.Server.Name='qp-ratking'
      OR dbo.Server.Name='qp-hyper2012'
      OR dbo.Server.Name='qp-hyped'
      OR dbo.Server.Name='qp-lichking')

GROUP BY Name
)

SELECT tempDiskSpace.Name, tempDiskSpace.Drive, tempDiskSpace.[Free Disk Space], tempProcessor.[CPU % Used], tempMemory.[% Mem Used]
FROM tempDiskSpace
LEFT JOIN tempProcessor ON tempDiskSpace.Name=tempProcessor.Name
LEFT JOIN tempMemory ON tempDiskSpace.Name=tempMemory.Name
ORDER BY Name, Drive;

感谢您的所有建议。

关于sql - 优化 SQL 查询以避免哈希匹配(聚合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824206/

相关文章:

mysql - 在MYSQL中搜索特定关键字

php - 我可以在一个 MySQL 查询中使用多个 WHERE 语句吗?

sql-server - 70 个数据库的 SQL Server 复制,并在短时间窗口内进行转换

javascript - 动态更新数百万 DOM 元素样式的最快方法

mysql - 使用自连接按两列分组时 SQL 查询速度较慢

C# + OracleSQL - 不能在 CommandText 中使用参数

mysql - 如何: Find and update all the entries where the value in one column shows up more than once

sql - DBCC CHECKIDENT 找不到表

sql-server - 为什么我的 SSRS 2012 图表不显示?

javascript - Google 表格 - 同时进行多表格排序和过滤