2012-03-29 56 views
3

我有一個數據庫表,它擁有數百萬行的客戶數據,並且需要將NVARCHAR(32)中的姓氏字段修改爲NVARCHAR(50)。該字段上有一個索引(非集羣)。我需要知道使用ALTER TABLE ALTER COLUMN語句進行此更改是否會自動重建索引。在SQL Server中增加NVARCHAR列的大小會導致索引重建嗎?

如果是這樣,我認爲這將需要相當多的時間。我們的生產升級過程是通過運行腳本的已發佈安裝程序完成的,我們需要預計升級需要多長時間。我們在SQL 2005和2008兩個版本中都有相當大的數據庫生產,所以如果不同,我需要知道兩者的答案。

我知道,增加列的大小不應修改像NVARCHAR這樣的可變長度字段中的數據,即使在沒有索引涉及的情況下,即使在大型數據集上也應該很快。我不清楚的是索引是否會導致速度變慢。

我在下面的鏈接中閱讀文檔,但它確實只是表明您可以使用現有索引進行更改,並且不指定對ALTER TABLE語句的執行時間可能產生的影響,或者索引是否之後必須重建,或者是自動完成的,等

http://msdn.microsoft.com/en-us/library/ms190273.aspx

在下面的鏈接真正的問題是幾乎我問這裏同樣的事情,但沒有令人滿意的答案在這其他職位,所以我想我會嘗試一個新的職位。

SQL Server 2005 Index rebuild when increasing the size of a varchar field

請讓我知道,如果你有這方面的經驗。如果我可以在一個可以實驗的大型數據庫中建立一個測試系統,我會公佈結果。

謝謝!

+0

我不相信索引需要重建,如果你所做的只是增加大小。除非你增加*和*在表中有'NULL'*和*將定義改爲NOT NULL *和*添加一個大於舊的大小的默認值,否則不會改變行,因此索引中的數據不會改變。但你可以肯定地測試這個*沒有*創建一個「可觀的數據庫」... – 2012-03-29 15:26:18

+0

好吧,很酷。你提到的那些東西都不適用於我的情況。在我需要修改的列上沒有定義NOT NULL約束或DEFAULT值。我想我會做什麼來測試語句執行時間是否受到影響,是創建兩個表,每個表都有一個VARCHAR(50)列,可以用一個簡單的腳本填充。我可以在一個表上放置一個索引,而在另一個表上不放入索引,並且當它們具有相同的數據並且唯一的區別是索引時,將每個表的列更改爲VARCHAR(100)的時間需要多長時間。 – Jim 2012-03-29 15:48:33

+0

在更改之前和之後查詢sys.dm_db_index_physical_stats可能還會顯示是否進行了重大更改。 – 2012-03-29 17:06:39

回答

3

否 - 即使在更改列大小(如所提及的nvarchar列)時,也不會在SQL Server中自動重建索引。索引是自動維護的,但不能重建。如果數據庫選項的「自動更新統計信息」已設置,則數據的統計/內部直方圖可能會自動更新。

相關問題