在查询开始时添加SET SHOWPLAN_ALL ON
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
哪个查询的性能更好?
在这种情况下,两个查询的性能以及它们各自的执行计划都将完全相同。
由于所有联接都是内部联接,因此将条件放在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
在查询开始时添加SET SHOWPLAN_ALL ON