create - 在SQL Server中分區大表的最好方法是什麼?



database table partitioning (4)

你是問數據庫設計方面的最佳實踐,還是說服你的領導改變主意? :)

在設計方面...回到過去的日子,有時需要垂直分區來解決數據庫引擎的限制,其中表中的列數是硬限制,如255列。 目前主要的好處是純粹的性能優勢:將少量使用的列或者blob放在單獨的磁盤陣列上。 但是,如果你經常從兩張桌子上拿東西,那很可能是一個損失。 這聽起來像你的主角正在遭受過早優化的情況。

就說你的領導是錯誤的...這需要外交。 如果他意識到性能方面的不滿情緒,基準可能是展示差異的最好方法。

用'create table t1 as select * from view1'創建一個新的物理表,然後用垂直分區表和新表運行一些冗長的批處理。 如果和你說的一樣糟糕,那麼差別應該是明顯的。

但是這也可能是不成熟的優化。 了解最終用戶對性能的看法。 如果性能足夠好,對於一些好的定義,那麼不要修補什麼不壞。

在最近的一個項目中,“首席”開發人員設計了一個數據庫模式,其中“較大”的表格將被拆分成兩個獨立的數據庫,並且在主數據庫上有一個視圖,將兩個獨立的數據庫表合併在一起。 主數據庫是應用程序被驅動的東西,所以這些表看起來像普通的表(除了一些古怪的東西更新)。 這似乎是一個巨大的性能問題。 我們確實看到這些桌子周圍的表現存在問題,但沒有什麼可以讓他改變他的設計思路。 只是想知道什麼是最好的方式來做到這一點,或者如果它是值得的呢?


Answer #1

你正在使用哪個版本的SQL Server? SQL Server 2005已經對錶進行了分區,但在2000(或7.0)中,您需要使用分區視圖。

另外,將表分區放入單獨的數據庫的原因是什麼?

當我不得不在過去(2005年以前)對錶進行分區時,通常是通過日期列或類似的東西,並且可以查看各個分區。 聯機叢書有一節討論如何做到這一點以及圍繞它的所有規則。 你需要遵循規則,使其工作如何工作。

關鍵要記住的是,分區列必須是主鍵的一部分,並且您想要在對錶的任何訪問中始終使用該列,以便優化程序可以忽略不受查詢影響的分區。

在MSDN中查找“分區表”,你應該能夠找到一個更完整的SQL Server 2005分區表教程,以及如何設置它們以獲得最佳性能的建議。


Answer #2

我不認為你真的會通過在單個服務器上跨多個數據庫分區表獲得任何東西。 所有你基本上完成的事情,首先通過在單個SQL Server實例下有幾個實例(即在兩個不同的數據庫中打開)來處理“表”,從而增加了開銷。

你有多大的數據集? 我有一個SQL Server中有600萬行表的客戶端,包含2年的銷售數據。 他們使用它交易和報告沒有任何不可知的速度問題。

調整索引並選擇正確的聚集索引對於性能當然是至關重要的。

如果你的數據集真的很大,而且你正在尋求分區,那麼你會得到更大的壓力,以便將物理服務器上的表分區。


Answer #3

我不同意這樣的假設,即劃分沒有任何東西可以得到。

如果分區數據在物理上和邏輯上對齊,那麼查詢的潛在IO應該大大減少。

例如:我們有一個表格,批處理字段作為表示INT的INT。

如果我們通過這個字段對數據進行分區,然後重新運行一個特定批次的查詢,那麼我們應該能夠在分區之前和之後運行set statistics,並看到IO的減少,

如果每個分區有一百萬行,並且每個分區都寫入一個單獨的設備。 查詢應該能夠消除不重要的分區。

我還沒有在SQL Server上做過很多的分區,但是我有在Sybase ASE上進行分區的經驗,這就是所謂的分區清除。 當我有時間的時候,我將在SQL Server 2005機器上測試這個場景。





partitioning