讓我們假設你有三列一個巨大的表,如下圖所示:SQL Server - 分區表與集羣索引?
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL
還假定您僅限於一個物理磁盤和一個文件組(主)。您預計此表在100個日期(容易1B +記錄)中保持10,000,000個ID以上的銷售額。與許多數據倉庫場景一樣,數據通常會按日期順序增長(即,每次執行數據加載時,您將插入新日期,並且可能會更新某些更新的數據日期)。出於分析目的,數據通常會被隨機查詢並彙總到〜10,000個id,這些id將通過與另一個表的聯接來指定。通常,這些查詢不指定日期範圍,或者指定非常寬的日期範圍,這引起我的問題:索引/分區此表的最佳方法是什麼?
我已經想了一段時間,但是卡具有衝突的解決方案:
選項#1:隨着數據將依次被日期被加載,定義羣集索引(和主鍵)作爲[日期],[id]。還可以在日期上創建「滑動窗口」分區功能/方案,以便將新數據快速移入/移出表格。有可能在ID上創建非聚集索引以幫助查詢。
預期的結果#1:這種設置會非常快的數據加載的目的,但次優的,當涉及到分析原文,在最壞的情況下(不受日期限制,不吉利與集ID的的查詢),可以讀取100%的數據頁面。
選項2:由於數據一次只能查詢一小部分ids,因此將聚集索引(和主鍵)定義爲[id],[date]。不要打擾創建分區表。
預期結果#2:由於我們無法再按日期快速限制,因此在加載數據時預期會有巨大的表現。當涉及到我的分析查詢時,預計會帶來巨大的性能收益,因爲它可以最大限度地減少讀取的數據頁的數量。
選項#3:集羣(和主鍵)如下:[id],[date]; 「滑動窗口」分區功能/方案日期。
預期結果#3:不知道該期待什麼。考慮到聚集索引中的第一列是[id],因此(這是我的理解)數據是按ID排列的,我希望我的分析查詢具有良好的性能。但是,數據按日期進行分區,這與聚簇索引的定義相反(但仍與日期成爲索引的一部分對齊)。我還沒有找到很多說明這種情況的文檔以及我可能從中獲得哪些性能優勢,這會帶來我最終的獎金問題:
如果我在一個文件組上創建表一個磁盤,在一列上有一個聚簇索引,在同一列上定義一個分區會帶來什麼好處(加載數據時除了分區切換)?
你最後一點很有趣。從float轉換爲numeric會帶來什麼樣的性能好處? – 2008-09-23 13:42:40
您可以更準確地瞭解您正在存儲的數據,並且數字數據類型是精確數字,其中浮點數是近似數字。 – GateKiller 2008-09-23 18:04:46