2017-06-13 103 views
0

我的應用程序對特定客戶執行的查詢非常緩慢。 我意識到客戶在一張桌子上有很多記錄。內部加入大表減慢查詢

查詢是這樣的

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

我注意到,在註釋中像這樣的更快的查詢證明:

SELECT T1.Field1,/*BT.Field2,*/ T3.Field3 
FROM TABLE1 T1 /*INNER JOIN 
BIGTABLE BT ON FIELDS*/ INNER JOIN 
TABLE2 T2 ON FIELDS 

所以我想這招,以減少Bigtable的大小:

--I use top 10 while the BIGTABLE contains 150000 records 
SELECT top 10 * 
INTO #BIGTABLE 
FROM BIGTABLE 

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
#BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

DROP TABLE #BIGTABLE 

執行此操作之前,我期待更快的查詢,但執行時間非常相似。 你能否建議一種研究表現的方法?

謝謝。

+3

您可能只需要在連接中使用的列索引。 –

+2

我不認爲150,000條記錄是一個「大」表,特別是對於SQL Server。你能發佈執行計劃嗎?可能是任何事情,但統計數據或索引可能關閉。如果您加入未索引的大型varchar字段,您也將遇到不好的時間。 –

+2

在這裏觀看前兩部(或所有)視頻:這將幫助你大量:https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-開源/ –

回答

0

研究的性能,你可以做幾件事情:

如果您運行從SSMS查詢然後簡單地包括實際的執行計劃(請在工具欄上的小圖標)運行查詢之前,並運行它。看看sqlplan或者你可以在這裏發佈它。有時會出現「表掃描」或其他耗費資源的操作,導致緩慢。該計劃將幫助你理解。

除了您的查詢之外,服務器上還可能運行其他功能,在過去,我使用Who Is Active Script from Adam Machanic來查找其他什麼使服務器保持忙碌狀態。看看你的SPID是否被其他查詢阻止(如果你運行亞當的腳本,它有一個blocking_session列會告訴你)。您幾乎需要DBA權限才能運行該腳本。有些人不建議經常在生產服務器上運行這個腳本。

您可以使用「WITH(READUNCOMMITED)」提示來查看是否有幫助。如果您不希望在查詢中看到髒數據,則不推薦這樣做。

+0

嗨。謝謝回覆。我在這裏貼上了這個計劃https://www.brentozar.com/pastetheplan/?id=B1MIB96Mb你能說點什麼嗎? – LaBracca

+0

EVA_REFERENCES是大表 – LaBracca

+0

如果你只需要選擇MF.ID_FUNZIONE和PA.ID_DIPENDENTE那麼你可以嘗試此查詢: '從 選擇MF.ID_FUNZIONE,PA.ID_DIPENDENTE PER_ANAGRAFICA PA INNER JOIN MSQ_PERS_FUNZIONI強積金強積金。 ID_DIPENDENTE = PA.ID_DIPENDENTE AND PA.STATO = 1 INNER JOIN MSQ_FUNZIONI MF ON MF.ID_FUNZIONE = MPF.ID_FUNZIONE WHERE EXISTS(SELECT 1 FROM EVA_REFERENCES ER INNER JOIN \t \t \t \t APP_SSHSR APP ON APP.ID_REF_IS_SS_PERIODICO_MANSIONI = ER.ID_EVA_REFERENCE_TYPES \t \t \t \t哪裏ER。ID_FOR_ALL = MF.ID_FUNZIONE)' – Nachi