gpt4 book ai didi

sql - 先过滤还是先加入?

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

我最初只是编写了一个查询来找出每个客户的年度总订单数大于 1。在 1.query 中,我过滤了结果集并将其与另一个找到客户名称的结果集连接起来。奇怪的是,我认为首先过滤会产生更好的性能,因为需要加入的结果更少。所以我编写了第二个查询,先连接,然后过滤,这看起来比第一个查询更整洁。结果与我预期的相同,因为结果中的所有时间都较低。但我不确定哪个时间最重要?或者说这个案例只是一个巧合?如何考虑性能?

use [AdventureWorks2012]
set statistics time on;

--1.filter first,join second
select tempC.*,tempP.FirstName,tempP.LastName
from
(select Year(OrderDate) As OrderYear,CustomerID,count(CustomerID) As CustomerOrderAmt
from Sales.SalesOrderHeader
group by Year(OrderDate),CustomerID
having count(CustomerID) >1
) as tempC
join(
select p.FirstName,p.LastName,c.CustomerID
from Person.Person as p join Sales.Customer as c on c.PersonID=p.BusinessEntityID
) as tempP
on tempC.CustomerID=tempP.CustomerID
order by tempC.OrderYear,tempC.CustomerID
GO

--2.join first,filter second

select Year(so.OrderDate) As Orderdate,so.CustomerID,count(so.CustomerID) As CustomerOrderAmt,p.FirstName,p.LastName
from Sales.SalesOrderHeader as so
join Sales.Customer as C on so.CustomerID=c.CustomerID
join Person.Person as p on c.PersonID=p.BusinessEntityID
group by Year(so.OrderDate),so.CustomerID,p.FirstName,p.LastName
having count(so.CustomerID)>1
go

最佳答案

查询优化器可以选择以产生相同逻辑结果的任何顺序执行操作,因此即使您尝试先过滤然后连接,除非您使用表变量或临时表强制执行操作,优化器也可能会连接然后过滤。

如果你真的相信优化器正在做一些愚蠢的事情,你可以尝试诸如 table var 或 temp table 之类的东西,但看起来愚蠢的事情实际上可能并不愚蠢,原因非常先进。

也就是说,有时您编写查询的方式影响优化器的操作,因此您通常应该查看执行计划。如果它们相同,请使用最清晰的代码。如果他们没有再次测试,就选择看起来最好的。

关于sql - 先过滤还是先加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226470/

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