2017-06-11 83 views
-1

我有一個查詢運行,但速度非常慢。涉及多個表格,它們都具有相同的用於日期和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我在上面的語句。

+0

而我在你的問題是什麼損失。我得到你有一個運行緩慢的查詢。你的問題有幾個疑問。 –

+0

澄清問題。我可以讓左連接工作得很好,但我想再次與另一個表連接,並且我一直收到一個錯誤,提示不是這樣做的方式。 – AI52487963

+0

如果您遇到錯誤,您應該確定包含該錯誤 –

回答

0

我剛想出解決方案。在我最初的查詢中,如果我在where語句的末尾添加了and B.FactDate = '2017-06-01'子句,那我就得到了優化後的查詢。

+1

否。將此置於'WHERE'子句中可將您的聯接轉換爲內部聯接。如果你想要一個內部連接,那麼你應該調用這個'INNER JOIN'。另一方面,如果你想留在外部聯接中,則將標準添加到「ON」子句中。 –