まず最初に:テーブルにはどれくらいのデータがありますか?テーブルの行数とサイズは?
2番目:このテーブルをバックアップしてテストサーバーに復元し、alterステートメントを実行して影響を確認できます(テーブルが大きすぎて非実動システムに収まらないために実行不可能ではない場合)。私の環境でのテストは、インターウェブからのアドバイスよりも正確であることが常にわかります。なぜなら、それらの要因が結果に影響を与える可能性があることを知らないために、質問に提供されない可能性がある結果に影響を与える可能性があるいくつかの要因があるためです。
3番目:可変長フィールドのサイズを増やすことは(実際のデータが変更されないため、8060バイトの制限を超えないと仮定した場合)単純なメタデータ操作です。しかし、一方で、可変長フィールドのサイズを小さくすることは、明らかに機能する以上のものであっても、そうではありません。すべての行をスキャンする前に、SQL Serverがわからないため、単純なメタデータの変更、 、新しく要求されたサイズが有効であること。
したがって、はい、これは一定期間テーブルをロックします。どのくらいの時間?さて、ここに私がやったテストがあります:
他のテストからINT NOT NULL
、1 つのフィールドと100万行のテーブルがありました。このテストを行うために、次の方法で新しいテーブルにコピーしました。
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
このようにして、MAX
フィールドを持つという類似のシナリオから始めました(あなたが持っていることVARCHAR
と私が使用していることに気付きましたが、それはNVARCHAR
私が見ている動作を変更するべきではありません)500
。また、500文字以内に簡単に収まるデータが含まれています。それには数分かかりました。
その後、私は走った:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
そして、それはわずか11分かかりました。
もう一度テストを再実行しました。今回は[ResizeTest]
テーブルを削除し、両方NVARCHAR
の値をVARCHAR
リンゴを少なくともリンゴのように見えるものと比較していることを確認します;-)。
最初のテーブルの作成には20秒かかりましたが、 ALTER TABLE
かかり、2かかりました。
そのため、ダウンタイムの推定に関しては、ディスクI / O速度に基づいているため、データファイルやトランザクションログなどで自動成長操作を行う必要があるかどうかにかかわらず、これを行うのは非常に困難です。おそらく最初のテストの変更に11分かかり、2番目のテストはデータのVARCHAR
半分のサイズであってもNVARCHAR
2分しかかからなかった(つまり、その時点でファイルが事前に作成されていた)のはおそらく大部分です。しかし、私のラップトップでテストを実行していることを覚えておく必要がありますが、これは最速のディスクではありませんが、2つの小さな列(行あたり22バイト程度)で100万行でした。
そして、あなたはそれがデータページに何をするか尋ねたので、ここにあなたの答えがあります。sp_spaceused
テーブルを作成した後、を実行したALTER COLUMN
後、およびを実行しALTER TABLE dbo.ResizeTest REBUILD;
た後に実行しました。結果(次の数値は、を使用しVARCHAR
た最初のテストではなく、を使用した2番目のテストに基づいていますNVARCHAR
):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
操作を可能な限り最短時間に維持する必要がある場合は、それを行うことについて書いた記事を参照してください。SRSLY!(無料登録が必要です)。
ALTER
連続して各列を編-各アクションは少ない秒以上かかりました。それらが完了するまでに、テーブルのサイズは2倍になりましたが、一度実行するとREBUILD
(これも1秒未満の操作でした)、テーブルは元のサイズに戻りました。