gpt4 book ai didi

sql-server - 为什么我的执行计划中出现了排序?

转载 作者:行者123 更新时间:2023-12-02 02:14:24 26 4
gpt4 key购买 nike

下面的 sql 查询运行速度非常慢。我查看了执行计划,它声称对 Files.OrderId 进行排序是成本最高的操作 (53%)。如果我没有在任何地方通过 OrderId 订购,为什么会发生这种情况?我最好的选择是在 File.OrderId 上创建索引吗?

Execution plan如果有人感兴趣的话。

with custOrders as
(
SELECT c.firstName + ' ' + c.lastname as Customer, c.PartnerId , c.CustomerId,o.OrderId,o.CreateDate, c.IsPrimary
FROM Customers c
LEFT JOIN CustomerRelationships as cr
ON c.CustomerId = cr.PrimaryCustomerId
INNER JOIN Orders as o
ON c.customerid = o.customerid
OR (cr.secondarycustomerid IS NOT NULL AND o.customerid = cr.secondarycustomerid)
where c.createdate >= @FromDate + ' 00:00'
AND c.createdate <= @ToDate + ' 23:59'
),
temp as
(
SELECT Row_number()
OVER (
ORDER BY c.createdate DESC) AS 'row_number',
c.customerid as customerId,
c.partnerid as partnerId,
c.Customer,
c.orderid as OrderId,
c.createdate as CreateDate,
Count(f.orderid) AS FileCount,
dbo.Getparentcustomerid(c.isprimary, c.customerid) AS ParentCustomerId,
au.firstname + ' ' + au.lastname AS Admin,
'' as blank,
0 as zero
FROM custOrders c
INNER JOIN files f
ON c.orderid = f.orderid
INNER JOIN admincustomers ac
ON c.customerid = ac.customerid
INNER JOIN adminusers au
ON ac.adminuserid = au.id
INNER JOIN filestatuses s
ON f.statusid = s.statusid
WHERE ac.adminuserid IS NOT NULL
AND f.statusid NOT IN ( 5, 6 )
GROUP BY c.customerid,
c.partnerid,
c.Customer,
c.isprimary,
c.orderid,
c.createdate,
au.firstname,
au.lastname
)

最佳答案

当 SQL Server 需要连接两个表时,可以选择三种算法。嵌套循环连接、哈希连接和排序合并连接。它选择哪一种是基于成本估算。在这种情况下,它认为,根据可用的信息,排序-合并-连接是正确的选择。

在 SQL Server 执行计划中,Sort-Merge 分为两个运算符:Sort 和 Merge-Join,因为排序操作可能不是必需的,例如,如果数据已经排序。

有关联接的更多信息,请查看我的联接系列:http://sqlity.net/en/1146/a-join-a-day-introduction/关于Sort-Merg-Join的文章在这里:http://sqlity.net/en/1480/a-join-a-day-the-sort-merge-join/

<小时/>

为了使查询更快,我首先会查看索引。您在查询中有一堆聚集索引扫描。如果你能用搜索来替换其中一些,你的情况很可能会更好。还要检查 SQL Server 生成的估计值是否与实际执行计划中的实际行计数匹配。如果它们相距甚远,SQL Server 常常会做出错误的选择。因此,提供更好的统计信息也可以帮助您提高查询性能。

关于sql-server - 为什么我的执行计划中出现了排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14219533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com