Index

聚集索引會加速這個查詢嗎?(帶有 where 子句的內連接)

  • February 26, 2017

我根據對另一個數據庫中現有表的選擇將數據插入到新數據庫中的新表中。現有表有大約 15 億行,我正在內部加入一個大約 10% 的表。兩個現有表都在 C5 上建立索引,而新表在 C2 上建立索引,這是一個 unixtime 列(我將隨著時間的推移對新表進行聚合)。這需要非常長的時間。它已經執行了 3 個多小時,新表剛剛超過 750 mb 大,我預計它填滿時大約為 50GB。這也是原始表的 50% 左右。

是因為我正在索引新的 unixtime 列嗎?

或者可能是我沒有為我在內部連接中使用的 C8 列編制索引?如果我將 C8 與 C5 聚集在一起,我可能會獲得更快的內部連接?

這是查詢:

INSERT INTO NewTable (C1, C2, C3, C4, C5, C6, C7) 
SELECT OldTable1.C1, OldTable1.C2, OldTable1.C3, OldTable1.C4, OldTable1.C5, OldTable1.C6, OldTable1.C7 
FROM OldTable1 
INNER JOIN OldTable2.C5 ON OldTable2.C5 = OldTable1.C5 
WHERE OldTable2.C8 >= 70 AND OldTable2.C8<= 89;

您完全破壞了 NewTable.C2 上的索引

只需刪除/禁用索引,然後在插入完成後建構/重建它

當您在事務日誌上施加大量負載時,您需要將其分解

如果要優化選擇,則只需單獨執行選擇

INSERT INTO NewTable (C1, C2, C3, C4, C5, C6, C7) 
SELECT OldTable1.C1, OldTable1.C2, OldTable1.C3, OldTable1.C4
    , OldTable1.C5, OldTable1.C6, OldTable1.C7 
FROM OldTable1 
JOIN OldTable2.C5 
 ON OldTable2.C5 = OldTable1.C5 
AND OldTable2.C8 >= 70 
AND OldTable2.C8 <= 89;

引用自:https://dba.stackexchange.com/questions/165525