样表发票
|invoice_total | client_id|
|2000 |1 |
|3000 |1 |
|2500 |3 |
|50 |3 | 代码-1
SELECT *
FROM invoices
WHERE invoice_total > (
SELECT MAX (invoice_total)
FROM invoices
WHERE client_ID =3
)vs
代码-2
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。
或者发生了内部优化,并且两者具有相同的性能?
发布于 2020-12-25 16:54:05
查询1
Scan count 2, logical reads 2
---------------
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 13 ms.
---------------
Query Cost is 49%sql优化器在子查询和外部查询之间使用内部连接来获取结果
查询2
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更好
发布于 2020-12-25 04:12:00
它们不会产生相同的结果。
如果没有用于client = 3的发票,则ALL将返回所有行。MAX()不返回任何行。
至于性能,你应该在你的数据库上测试。MySQL可能对它们进行了类似的优化,但可能会有差异,因为含义不同。
https://stackoverflow.com/questions/65442834
复制相似问题