2016-12-16 89 views
1

我得到了一個有2TB數據的數據庫,我想通過刪除一些行並刪除一些無用的列來將它減少到500Go,但我還有其他的優化想法,我需要一個答案之前有些問題。減少sql數據庫的磁盤空間

我的數據庫有一個.mdf文件,和另外9個.ndf文件,每個文件的標籤大小爲100Go。

  1. 我是否應該將每個.ndf文件的初始大小減小到50Go?此操作是否會影響我的數據?
  2. 刪除索引有助於減少空間?

PS:我的數據庫中只包含一個單一的表,有一個聚集索引和其他兩個非聚集索引,

  • 我想刪除兩個非聚集索引
  • 取出insertdate列

如果你有優化的任何其他的想法,那將是非常有益的

+0

如果您的數據庫只有一個表 - 而且您沒有使用任何關係特性,那麼實現您自己的平面文件存儲和索引系統可能會更好。 – Dai

+0

您不能減小初始文件大小(除非在最新版本的SQL Server中已更改) – DavidG

+0

因此,您建議我基於第一個數據庫創建另一個數據庫? –

回答

1

在刪除任何索引之前,運行這兩個視圖。

sys.dm_db_index_usage_stats

sys.dm_db_index_operational_stats中

他們會讓你知道,如果其中任何一個被用來支持查詢。你想要的最後一件事是刪除一個索引並開始在2TB表上看到全表掃描。

如果您無法將表格分解爲關係模型,請嘗試這些初學者。

  1. 檢查您的數據類型。

- 你可以用CHAR或VARCHAR或NCHAR替換NVARCHAR嗎? (他們佔用了一半的空間)

- 你的桌面體驗了很多更新或很多插入(上面的視圖會告訴你這個)?如果更新很少,則考慮將CHAR字段更改爲VARCHAR字段。繁重的更新可能會導致頁面拆分並導致較差的頁面豐滿度。

- 確認只存儲沒有時間日期列不聲明爲日期時間在數字領域,即嘗試使用的不是int SMALLINT

- 檢查值範圍。

  1. 看看錶上的活動,更新&插入行爲。如果活動意味着很少頁面被重新安排,那麼考慮增加填充因子。

  2. 看看計劃緩存,瞭解如何查詢表,如果大量查詢集中在表的特定部分,然後實現過濾索引。

  3. 您的羣集索引是否唯一?如果沒有,那麼SQL會創建一個「隱藏的額外Integer列」,在引擎蓋下創建唯一性。

+0

對於數據類型我得到了varchar(22),varbinary(max),一點和日期。 表是一個靜態表,它將來不會改變,我只需要聚簇索引來幫助用戶對它進行一些快速搜索,並且該列是唯一的。 –

+0

感謝您的好信息,但它並沒有幫助我與我的情況:) –

+0

它看起來像varbinary是問題,如果varbinary包含很多重複,那麼你可以創建一個「超級維度」,並在您的表中有一個整數,鏈接到維度中的唯一值。 – pacreely