在具有超过一百万行的表中,哪种效率更高?交叉联接还是子查询?

时间:2018-08-11 19:43:49

标签: sql database performance

我需要创建一个视图,该视图将过滤在辅助表中仅在1行中设置的日期范围:

aux_date_table

start_date     end_date
------------------------
08/01/18       08/11/18

main_table

date        subject
--------------------------
01/08/18    inoninoininoi
01/08/18    inoninoininoi
01/08/18    inoninoininoi
02/08/18    inoninoininoi
02/08/18    inoninoininoi
02/08/18    inoninoininoi
03/08/18    inoninoininoi
03/08/18    inoninoininoi
03/08/18    inoninoininoi
04/08/18    inoninoininoi
.
.
.

第一个选项是:

select main_table.* 
from main_table, aux_date_table
where main_table.date between aux_date_table.start_date 
                          and aux_date_table.end_date

第二个选项是:

select main_table.* 
from main_table
where main_table.date between (select start_date from aux_date_table) 
  and (select end_date from aux_date_table)

哪个选项最有效?

1 个答案:

答案 0 :(得分:2)

我将使用JOIN而不是第一个选项或第二个选项,因为这样可以更清楚地说明您要做什么。

select main_table.* from main_table 
INNER JOIN aux_date_table 
ON main_table.data between aux_date_table.start_date and aux_date_table.end_date

您的第一个选择是CROSS JOIN,但样式过旧。

我建议您使用CROSS JOIN而不是,

select main_table.* 
from main_table CROSS JOIN aux_date_table
where main_table.data between aux_date_table.start_date and aux_date_table.end_date

如果您想选择哪个更快,我会选择第一个选项。

因为第二个选项在performance比第一个更糟糕的情况下使用子查询。