Sql-Server
SQL Server:ETL 階段索引
我們有一個非常大的臨時表(> 80 GB)。從我們的源系統中,我們將發票數據載入到臨時表中。從分期開始,我們將數據轉換並載入到 DWH/Fact 中。每天我們刪除目前月份,然後從源重新載入到階段。該階段包含隨著時間推移的完整歷史。
在某些 DW 負載中,我們只需要目前月份。有時是一年和前一年。
什麼是更好的索引策略:
- 列上的聚集索引
date
(會計期間)IDENTITY
作為代理鍵的主鍵- 自然鍵的聚集索引(某種行項目,例如發票號)
所有查詢都包含
date
列(會計期間),有時還包含像發票類型這樣的附加列作為非聚集索引。在 ETL 中,我們可以禁用非聚集索引,但不能禁用聚集索引。這三種類型中的哪一種具有最佳性能:
- 插入舞台表
- 查詢 Stage 表
如果您可以使用分區,我強烈建議您在這種情況下利用它,因為您知道您正在處理幾個月或幾年的周期性數據載入。通過分區,您可以保留在其他列上創建索引,這些列可能需要在 InvoiceNo 等內容上。讓分區負責隔離您正在使用的月份或時間段。
如果您相當確定日期是您的連接或搜尋的組成部分,那麼我將為您的載入策略關聯一個“智能鍵”並在其上放置一個聚集索引。
如果您真的決定將日期用作索引查找,那麼我會在此欄位上放置一個非聚集索引,因為無論如何您可能都必須掃描案例中的行。請記住,在日期上創建聚集索引,然後進行更新或刪除會使您的表碎片化。
對於日期鍵,您可能更喜歡數字。因此,對於 2016 年 4 月 7 日,201604(或 20160407,如果有擴展要求)可能最適合您的約會。我不認為在 DW 中你需要一個 IDENTITY 列作為主鍵。畢竟,您更多的是聚合然後要求查看特定值。我所做的是確保索引避免重複值:例如,擁有一個由幾列組成的聚集索引。通過這種方式,我可以辨識特定行並確保沒有重複,同時避免可能達到非常大的數字的“IDENTITY”(並且沒有可用性原因)。