Sql 在连接非常大的表进行优化之前,是否需要过滤所有子查询

Sql 在连接非常大的表进行优化之前,是否需要过滤所有子查询,sql,optimization,filter,subquery,Sql,Optimization,Filter,Subquery,我有三个表,每个表有超过十亿行。每个表在“帐单日期”列上都有一个索引。如果我只是过滤左边的表并进行连接,查询是否会高效运行,还是需要在每个子查询中放置相同的日期过滤器 即,第一个查询的运行速度是否比第二个查询慢得多 select item, billing_dollars, IC_billing_dollars from billing left join IC_billing on billing.invoice_number = IC_billing.invoice_number where

我有三个表,每个表有超过十亿行。每个表在“帐单日期”列上都有一个索引。如果我只是过滤左边的表并进行连接,查询是否会高效运行,还是需要在每个子查询中放置相同的日期过滤器

即,第一个查询的运行速度是否比第二个查询慢得多

select item, billing_dollars, IC_billing_dollars
from billing
left join IC_billing on billing.invoice_number = IC_billing.invoice_number
where billing.date = '2019-09-24'

select item, billing_dollars, IC_billing_dollars
from billing
left join (select * from IC_billing where IC_billing.date = '2019-09-24') on billing.invoice_number = IC_billing.invoice_number
where billing.date = '2019-09-24'
我不想在不知道查询是否会执行良好的情况下运行此操作,因为对于执行不佳的查询没有太多保护措施。另外,如果我需要用第二种方法编写查询,是否有一种方法只在一个位置使用日期过滤器,而不是在查询中多次显示它?

这取决于具体情况

考虑您的问题:

select b.item, b.billing_dollars, icb.IC_billing_dollars
from billing b left join
     IC_billing icb
     on b.invoice_number = icb.invoice_number
where b.date = '2019-09-24';
(假设列来自正确的表。)

最佳策略是在
账单(日期、发票号)
上建立一个索引,也可能在索引中加入
项目
账单金额
;和
ic\u账单(发票号)
——可能是
ic\u账单

我可以想到两种情况,在
ic\u billing
中按日期过滤会很有用

首先,如果在
(发票日期、发票编号)
上有索引,尤其是主键定义。然后,通常首选使用此索引,即使有其他索引可用

其次,如果
ic\u账单
invoice\u日期
划分。在这种情况下,您需要为性能指定分区


不过,一般来说,对发票日期的额外限制没有帮助。在某些数据库中,它甚至可能会影响性能(特别是如果子查询是具体化的,而外部查询没有使用适当的索引)。

您能否在第一次查询中尝试IC_billing.billing.date并查看差异?现在,由于您在第一次查询中没有为billing.date提供任何别名,所以它将从主表中获取该别名。但是在send查询中,它是不同的。任何现代优化器都会对这两个查询进行相同的处理。您使用的是哪种DBMS产品?