首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL中“> ALL”VS "MAX()“的性能

SQL中“> ALL”VS "MAX()“的性能
EN

Stack Overflow用户
提问于 2020-12-25 04:07:45
回答 2查看 66关注 0票数 1

样表发票

代码语言:javascript
复制
|invoice_total | client_id|

|2000          |1         |
|3000          |1         |
|2500          |3         | 
|50            |3         |            

代码-1

代码语言:javascript
复制
SELECT * 
FROM invoices
WHERE invoice_total > (
 SELECT MAX (invoice_total)
 FROM invoices
 WHERE client_ID =3
)

vs

代码-2

代码语言:javascript
复制
SELECT * 
FROM invoices
WHERE invoice_total >  ALL (
 SELECT invoice_total
 FROM invoices
 WHERE client_ID =3
)

我浏览了一些在线的SQL视频,讲师说这两个是等同的。虽然两者产生的结果相同,但在性能方面,code-1不是比code-2更好吗?

据我所知:在代码-1的情况下,DB被处理了两次:一次是获取max(),第二次是获取比max()结果更大的所有值。复杂性= N+K

而在代码-2的情况下,将每一行与来自子查询的结果列表进行比较。复杂度= N*K。

或者发生了内部优化,并且两者具有相同的性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-25 16:54:05

查询1

代码语言:javascript
复制
 Scan count 2, logical reads 2
---------------
 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 13 ms.
---------------
Query Cost is 49%

sql优化器在子查询和外部查询之间使用内部连接来获取结果

查询2

代码语言:javascript
复制
 Scan count 2, logical reads 5
---------------
 SQL Server Execution Times:
   CPU time = 15 ms,  elapsed time = 159 ms.
---------------
Query Cost is 51%

sql优化器在子查询和外部查询之间使用左连接获取结果

两个查询中的子查询成本相等。我认为Query1比Query2更好

票数 1
EN

Stack Overflow用户

发布于 2020-12-25 04:12:00

它们不会产生相同的结果。

如果没有用于client = 3的发票,则ALL将返回所有行。MAX()不返回任何行。

至于性能,你应该在你的数据库上测试。MySQL可能对它们进行了类似的优化,但可能会有差异,因为含义不同。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65442834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档