2016-12-02 44 views
0

以下是我的SQL查詢,其中包含五個內部聯接。執行需要10分鐘。我們如何優化這個查詢來加快運行速度?如何優化SQL查詢執行時間

SELECT DISTINCT a.assesmt_no, 
       a.parcel_no, 
       vi.struct_no, 
       om.own_first AS TaxpayerName 
FROM assessments a 
INNER JOIN owner om ON om.id = a.owner_id 
INNER JOIN valueimp vi ON vi.assesmt_no = a.assesmt_no 
INNER JOIN imp_details imp ON imp.improvementId = vi.id 
INNER JOIN imp_components_details impdt ON impdt.quality_id = imp.quality_id 
INNER JOIN category_items ci ON ci.category_id = impdt.category_id 
WHERE ci.category_id <> 3 
+4

確保沒有對錶的索引。運行的查詢執行計劃,應可幫助您找出其中的查詢速度很慢。 – Snowlockk

+0

也許<> 3.嘗試改爲IN運算符,就像(2,4,7)中的category_id –

+0

在xml中發佈實際的執行計劃 –

回答

0

所有加入該乘行可能會轉化爲exists,之後你就可以放棄distinctcategory_id <> 3使它無法做其他事情比scan除非大多數行有category_id=3,只有其中幾個<>

所以,沒有DDL和其他信息我的猜測是:

select 
    a.assesmt_no, a.parcel_no, vi.struct_no, om.own_first as TaxpayerName 
from assessments a 
inner join owner om on om.id = a.owner_id 
inner join valueimp vi on vi.assesmt_no = a.assesmt_no 
where exists(
    select 1 
    from imp_details imp 
    inner join imp_components_details impdt on impdt.quality_id = imp.quality_id 
    inner join category_items ci on ci.category_id = impdt.category_id 
    where imp.improvementId = vi.id 
     and ci.category_id <> 3 
) 

而且恐怕沒有別的可以用它做。

+0

這是一個很對我的猜測有很好的猜測 –

+0

這不是一個猜測,這並沒有太大的區別,你只是在猜測 – Nitin

+0

好吧,我建議你閱讀有關'DISTINCT'和什麼廣告的文檔它需要的術語操作,關於'EXISTS'和它提供的優化可能性,嘗試執行一些查詢和檢查不同的**執行計劃**。 –

0

請在您的查詢


附註的末尾添加option (hash join,hash group)

  1. 是否需要加入imp_detailsimp_components_details
    是否用於過濾目的?
  2. 爲什麼你會看到重複的(因此使用distinct
+0

這是一個相當的假設,不知道每個表中有多少記錄,當前存在哪些索引,或者查詢選擇了哪些特定的操作員 –

+0

@ Nick.McDermaid,您想要對100個信譽分數下注嗎? –

+0

不,我喜歡測量,基準和投注信息。但我敢打賭,你會像其他人一樣放棄這個問題! :)。我的意思是,如果查詢碰巧有一堆令人敬畏的聚簇索引,那麼每次合併最好的操作符 –