我有一个关于SQL代码处理的问题。下列哪一个程序更有效?还是一样的?
我的理解-第二个程序更有效,因为它在联接之前对数据进行了细分。
select a.custid, b.ref_date,b.status
from customertable a
left join accounts b
on a.custid = b.custid
where '2015-01-01' <= b.ref_date <= '2016-01-01'
select a.custid, b.ref_date,b.status
from customertable a
left join (select * from accounts
where '2015-01-01' <= ref_date <= '2016-01-01') b
on a.custid = b.custid发布于 2016-06-02 16:57:52
SQL是一种声明性语言,这意味着您要告诉系统您想要什么结果,并决定如何获取这些结果。因此,在大多数情况下,无法肯定地说对另一个查询的查询是否更“高效”,因为编译器在开发什么计划方面有很大的回旋余地。
尽管如此,您的两个查询并不等价。
假设您有以下数据:
customertable
-------------
custid
------
1
2
accounts
--------
custid refdate
------ -------
1 2015-01-01
2 2014-01-01 第一个查询的结果将不包括customer 2,因为where子句会过滤掉它,因为有一个匹配的帐户,但是refdate不在所需的范围内。第二个查询将包括customer 2,但是refdate和status将是null,因为匹配的帐户不满足join子句。
以下查询相当于您的第二个查询:
select a.custid, b.ref_date,b.status
from customertable a
left join accounts b
on a.custid = b.custid
and '2015-01-01' <= b.ref_date <= '2016-01-01'我不认为这两个查询在效率上会有显著差异,因为编译器提出的计划可能是相同的。
一般来说,唯一可以肯定地说,如果一个查询比另一个查询更有效率的话,那就是尝试这两种方法,并测量结果。即使这样,它也可能并不总是更高效,因为随着时间的推移,例如数据分散、索引的效率和其他因素的变化,可以使一个查询在给定的上下文中更高效。
https://stackoverflow.com/questions/37597808
复制相似问题