2012-08-24 25 views
0

比較比方說,我們有一個耗時下面描述的查詢:優化聯接:與索引的表

(SELECT ... 
FROM ...) AS FOO 
LEFT JOIN (
    SELECT ... 
    FROM ...) AS BAR 
ON FOO.BarID = BAR.ID 

讓我們假設

(SELECT ... 
FROM ...) AS FOO 

返回許多行(比方說10 M)。每一行都必須與BAR中的數據結合。

現在讓我們說我們插入的

SELECT ... 
    FROM ...) AS BAR 

結果在表中,並特設指數(ES)添加到它。

我的問題

怎樣的「加盟」與現場查詢性能從「加入」到包含以前現場查詢結果表中的表現不同,哪些ad hoc索引會被添加?

另一種方式把它:

如果加入過程緩慢,會有在實際存儲和索引,這是我們JOIN表中的任何增益?

+0

這可能取決於您希望存儲的表的大小以及索引,因爲創建這樣的表,將新行插入表中,然後在該表上編制索引本身可能非常耗時... –

+0

@astander:請注意,問題實際上是關於「選擇」(插入索引變慢,但這不是重點:))。 –

+0

@astander:在選擇期間獲得或失去性能的事實恕我直言,不取決於要存儲的表的大小。我們正在談論解決方案A與解決方案B的相對錶現。不是關於絕對性能與表格大小的關係。 –

回答

1

答案是'也許'。

它取決於有問題的數據的統計。唯一確定的方法是實際將第一個查詢加載到臨時表中,在其上粘貼相關索引,然後運行查詢的第二部分。

我可以告訴你速度是否是你想要的,如果你可以將你的第一個查詢的結果永久加載到一個表中,那麼你的查詢當然會更快。

如果你希望它更快,取決於你使用的是哪個DBMS,你可以考慮創建一個跨越兩個表的索引 - 如果你使用的是SQL Server,他們被稱爲「索引視圖」,或者你也可以查看其他系統的「實體索引」。最後,如果您想要極速,請考慮對數據進行非規格化並消除正在發生的連接 - 基本上,您需要以存儲空間和數據一致性爲代價將預處理(連接)移至離線狀態(根據您運行更新的頻率,您的實時表將稍微落後)。

我希望這會有所幫助。

+0

這真的有所幫助。非常感謝大衛。 –