使用多个联接和日期过滤器进行查询优化

时间:2017-06-11 18:33:27

标签: sql sql-server azure-sql-database

我有一个运行的查询,但速度非常慢。涉及的多个表都具有相同的date和id命名列。由于行数很大(3M +),因此需要按日期过滤以加快速度。我做了一个基本的联合工作,但我想知道如何进一步优化。

运行速度非常慢的查询看起来像:

select 

A.date
,A.id
,A.col3
,B.id2
,B.colR
,B.colS
,C.colX
,C.colY
,C.colZ

from table1 A
    left join table2 B on A.id = B.id
    left join table3 on B.id2 = C.id2

where A.date = '2017-06-01' and A.col3 = 'test' and B.id2 is not NULL

现在,表2也有一个date字段,我也想过滤它。我重写了这样的查询,这运行得很好:

select 

    A.date
    ,A.id
    ,A.col3
    ,B.id2
    ,B.colR
    ,B.colS

from

(select date, id, col3 from table1 where date='2017-06-01' and col3='test') A
left join (select date, id, colR, colS from table2 where date='2017-06-01') B on A.id=B.id where B.colR is not NULL

但现在问题是我如何加入表3.我采用另一个left join来加入我已经拥有的联接的方法似乎与我接近它的方式相同在我最初的,优化不佳的查询中。这种方法看起来像:

select 

    A.date
    ,A.id
    ,A.col3
    ,B.id2
    ,B.colR
    ,B.colS
    ,C.colX
    ,C.colY
    ,C.colZ

from

(select date, id, col3 from table1 where date='2017-06-01' and col3='test') A
left join (select date, id, id2, colR, colS from table2 where date='2017-06-01') B on A.id=B.id where B.colR is not NULL
left join (select id2, colX, colY, colZ from table3) C on B.id2 = C.id2

如果上面的查询不起作用,我应该如何加入表3?我得到的具体错误是:

Msg 103010, Level 16, State 1, Line 1 Parse error at line: 33, column: 1: Incorrect syntax near 'left'.

这是我在上述声明中的第二个left join

1 个答案:

答案 0 :(得分:0)

我刚刚想出了解决方案。在我的原始查询中,如果我刚刚在and B.FactDate = '2017-06-01'语句的末尾添加了where子句,那么我将获得我所追求的优化查询。