2008-09-16 71 views
3

爲什麼使用帶有SELECT語句的臨時表可以提高邏輯I/O數?它不會增加到數據庫的命中數量,而不是減少命中數量。這是因爲'問題'被分解成多個部分?我想知道幕後發生了什麼。臨時表和SQL SELECT性能

+0

什麼DBMS?你在說什麼SQL - 粘貼它! – 2008-09-16 15:07:48

回答

2

沒有一般的答案。這取決於如何使用臨時表。

臨時表可以通過緩存在批次中多次使用的複雜過濾器/連接之後創建的行來減少IO。這樣,當只需要記錄的一個子集時,數據庫可以避免多次觸擊基表。

臨時表可能會增加IO,方法是存儲以後從未用過的記錄,或者佔用引擎緩存中可能被其他數據更好使用的大量空間。

創建臨時表以使用其所有內容一次比在主查詢中包含臨時查詢要慢,因爲查詢優化器無法看到臨時表並且強制(可能)不必要的數據spool而不是允許它從源表流式傳輸。

+0

值得一提的是,只有當你的RAM或你的配置不允許使用磁盤這樣的gib memeory表時,normaly纔會將臨時表編譯爲類型爲MEMORY,這會降低臨時表的重要性。 – Rufinus 2009-08-07 00:59:25

0

據我所知,至少使用MySQL,TMP表保存在RAM中,使得選擇除任何撞擊HD快得多

0

有一類的地方建設的結果在收集結構在數據庫方面的問題比將結果的部分返回給客戶端更合適,每個部分往返。

例如:任意深度的遞歸關係(老闆)

還有另一個類的,其中數據是一概不的方式,有效地使得所述查詢的運行被索引的查詢的問題。將結果拉入可以自定義方式編入索引的集合結構中,將減少這些查詢的邏輯IO。

1

我將通過臨時表來假設您是指WHERE子句中的子選擇。 (這被稱爲半連接操作,通常您可以在查詢的文本執行計劃中看到該操作。)

當查詢優化器遇到子選擇/臨時表時,它會對做什麼做出一些假設與該數據。本質上,優化器將創建一個執行計劃,對子選擇的結果集執行連接,從而減少需要從其他表中讀取的行數。由於行數較少,查詢引擎能夠從磁盤/內存中讀取較少的頁面並減少所需的I/O數量。