寻找更好的查询[关闭]

问题描述 投票:-3回答:2
SELECT o.orderid, o.days, o.number
FROM tab_order AS o
JOIN tab_stock AS s
   ON o.orderid = s.orderid
JOIN tab_products AS p
   ON o.prodid = p.prodid
WHERE o.quantity = 361;

SELECT o.orderid, o.days, o.number
FROM Tab_order AS o
JOIN tab_stock AS s
   ON o.orderid = s.orderid AND o.quantity = 361
JOIN tab_products AS p
   ON o.prodid = p.prodid

哪个查询的性能更好?

sql-server tsql query-performance
2个回答
0
投票

在这种情况下,两个查询的性能以及它们各自的执行计划都将完全相同。

由于所有联接都是内部联接,因此将条件放在on子句还是where子句中的问题是一个语义问题。

语义上,第一个查询更好。对于内部联接,仅与查询中的表之一相关的条件应位于where子句中。

请注意,在使用外部联接的情况下,该规则不再适用-每个条件在查询中的位置都会对问题产生影响(根据查询的结果集可能是什么。)>

[使用左联接,仅与右表相关的条件应放在on子句中,否则查询将有效地转换为内部联接查询(当然,如果您使用的是右联接,对于仅与左表有关的条件也是如此)

例如:以下查询将返回表1中的所有Id值以及以Z开头的表2中的名称值。

SELECT l.Id, r.Name
FROM Table1 As l
LEFT JOIN Table2 As r
    ON l.Id = r.Id
   AND r.Name LIKE 'Z%'

但是,下一个查询将仅返回两个表中存在相同ID值的记录:

SELECT l.Id, r.Name
FROM Table1 As l
LEFT JOIN Table2 As r
    ON l.Id = r.Id
WHERE r.Name LIKE 'Z%'

在查询开始时添加SET SHOWPLAN_ALL ON

,它将向您显示查询的处理方式以及执行每个步骤所花费的时间。

参考:https://docs.microsoft.com/en-us/sql/t-sql/statements/set-showplan-all-transact-sql?view=sql-server-ver15


-3
投票

在查询开始时添加SET SHOWPLAN_ALL ON

© www.soinside.com 2019 - 2024. All rights reserved.