Sql-Server

為什麼在 SQL Server 的 tempDB 中使用排序重建索引時我的數據庫大小會增加?

  • October 28, 2019

我正在使用以下命令執行Ola Hallengren 的SQL 維護腳本:

EXECUTE [dbo].[IndexOptimize]
@Databases = 'MyDatabase'
, @FragmentationLow = NULL
, @FragmentationMedium = 'INDEX_REBUILD_OFFLINE'
, @FragmentationHigh = 'INDEX_REBUILD_OFFLINE'
, @FragmentationLevel1 = 10
, @FragmentationLevel2 = 30
, @UpdateStatistics = 'ALL'
, @OnlyModifiedStatistics = 'Y'
, @LogToTable = N'Y'
, @TimeLimit = 23400
, @MinNumberOfPages = 1000
, @Indexes = 'ALL_INDEXES'
, @MaxDOP = 7
, @SortInTempdb = 'Y'

直到最近,由於空間限制,一些索引無法重建,所以我將 tempDB 轉移到它自己的驅動器,將 tempDB 配置為使用 8 個不同的文件,並開始在 tempDB 中排序(每個 tempDB 文件大約為 10GB,增長設置為 500MB每個)。一些以前難以重建的索引能夠相對較快地完成,但是,我有一個已經執行了一個多小時的索引,MyDatabase並且該數據庫的大小正在迅速增加。目前沒有其他任何東西在執行,而且 TempDB 的大小根本沒有增加。

誰能幫我弄清楚為什麼MyDatabase增長如此之快?有沒有人對它可能導致這種情況有任何建議?

如果有幫助,請執行 SQL Server 2012。謝謝

我引用了不同文章的三個部分,並在底部給出了連結。底線是您需要新索引的空間來建構以及用於回滾的事務日誌空間。如果您無法容納所需的空間,您可能需要考慮INDEX_REORGANIZE

創建新索引結構時,舊(源)和新(目標)結構的磁碟空間都需要在其相應的文件和文件組中。在索引創建事務送出之前,舊結構不會被釋放。

索引重建(無論是線上還是離線,並且至少可以追溯到 7.0)將在刪除舊副本之前創建索引的新副本。與 SQL Server 中的任何其他操作一樣,將始終根據需要分配執行此操作所需的頁面和範圍。

離線或線上執行的大規模索引操作會產生大量數據負載,從而導致事務日誌快速填滿。為確保索引操作可以回滾,在索引操作完成之前不能截斷事務日誌;但是,可以在索引操作期間備份日誌。因此,事務日誌必須有足夠的空間來儲存索引操作事務和索引操作期間的任何並髮使用者事務。有關詳細資訊,請參閱索引操作的事務日誌磁碟空間。

參考:

  1. Paul Randal對索引重建(分配、BULK_LOGGED 模式、鎖定)的誤解
  2. 需要額外磁碟空間的索引操作
  3. 索引操作的事務日誌磁碟空間

引用自:https://dba.stackexchange.com/questions/252059