簡體   English   中英

在MS SQL Server中管理大量表的最佳方法是什么?

[英]What's the best way to manage a large number of tables in MS SQL Server?

這個問題與另一個問題有關:
有多個文件組會有助於加速我的數據庫嗎?

我們正在開發的軟件是一個分析工具,它使用MS SQL Server 2005來存儲關系數據。 初步分析可能很慢(因為我們正在處理數百萬或數十億行數據),但是對於快速調用以前的分析存在性能要求,因此我們“保存”每個分析的結果。

我們當前的方法是將分析結果保存在一系列“特定於運行”的表中,並且分析非常復雜,每次分析最多可能有100個表。 通常,這些表每次分析耗盡幾百MB(與我們的數百GB,有時甚至是多TB的源數據相比,這個表很小)。 但總的來說,磁盤空間對我們來說不是問題。 每組表都特定於一個分析,在許多情況下,這為我們提供了超過回溯源數據的巨大性能改進。

一旦我們積累了足夠的保存分析結果,這種方法就會開始崩潰 - 在我們添加更強大的歸檔/清理功能之前,我們的測試數據庫已經攀升到數百萬個表。 但即使在生產中,我們也不能擁有超過100,000張桌子。 微軟對sysobjects的大小(約20億)進行了相當大的理論限制,但是一旦我們的數據庫增長到100,000以上,像CREATE TABLE和DROP TABLE這樣的簡單查詢就會大大減慢。

我們有一些空間來討論我們的方法,但我認為如果沒有更多的背景可能很難做到,所以我想更廣泛地提出這個問題:如果我們被迫創建這么多表,那么最好的管理方法是什么他們? 多個文件組? 多個架構/所有者? 多個數據庫?

另一個注意事項:我對於“簡單地將硬件投入問題”(即添加RAM,CPU功率,磁盤速度)的想法並不感到興奮。 但我們也不會排除它,特別是如果(例如)某人可以明確地告訴我們添加RAM或使用多個文件組對管理大型系統目錄會產生什么影響。

在沒有首先看到整個系統的情況下,我的第一個建議是將歷史運行保存在組合表中,並將RunID作為鍵的一部分 - 維度模型也可能與此相關。 可以對此表進行分區以進行改進,這也允許您將表擴展到其他文件組中。

另一種可能性是將每次運行放在自己的數據庫中然后分離它們,只根據需要附加它們(並且以只讀形式)

CREATE TABLE和DROP TABLE可能表現不佳,因為主數據庫或模型數據庫未針對此類行為進行優化。

我還建議您與Microsoft討論您選擇的數據庫設計。

表格是否都是不同的結構? 如果它們是相同的結構,您可能會使用單個分區表。

如果它們是不同的結構,但只是同一組維度列的子集,您仍然可以將它們存儲在同一個表中的分區中,並且在不適用的列中使用空值。

如果這是分析(衍生定價計算可能?),您可以將計算運行的結果轉儲到平面文件,並通過從平面文件加載來重用您的計算。

這似乎是您正在使用的一個非常有趣的問題/應用程序。 我很樂意在這樣的事情上工作。 :)

你有一個非常大的問題表面區域,這使得很難開始幫助。 您的帖子中有幾個解決方案參數不明顯。 例如,您計划保留運行分析表多長時間? 還有很多其他問題需要提出。

您將需要結合嚴格的數據倉庫和數據/表分區。 根據您要保留和存檔的數據量,您可能需要開始對表進行反規范化和展平。

這是非常好的情況,直接聯系Microsoft可以互惠互利。 微軟得到了向其他客戶展示的好例子,您可以直接從供應商處獲得幫助。

我們最終將數據庫拆分為多個數據庫。 因此,主數據庫包含一個“數據庫”表,該表引用一個或多個“運行”數據庫,每個數據庫包含不同的分析結果集。 然后主“運行”表包含數據庫ID,檢索保存結果的代碼包括所有查詢的相關數據庫前綴。

這種方法允許每個數據庫的系統目錄更加合理,它可以更好地分離核心/永久表和動態/運行表,還可以使備份和歸檔更易於管理。 它還允許我們跨多個物理磁盤分割數據,盡管使用多個文件組也可以這樣做。 總的來說,考慮到我們目前的要求,它現在對我們來說運作良好,並且基於預期的增長,我們認為它也將為我們很好地擴展。

我們還注意到SQL 2008傾向於比SQL 2000和SQL 2005更好地處理大型系統目錄。 (當我發布這個問題時,我們沒有升級到2008年。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM