SQL Server - テーブルvsドロップと作成
-
28-09-2020 - |
質問
私たちのデータベースはSQL Server 2008 R2です。 DateTime2またはBigIntに切り替えたいvarchar(500)列を持ついくつかのテーブルがあります。切り替える列内のすべてのデータが適切な種類に有効であることを保証できます。列の変更は索引に影響を与えますが、キーは表示されません。
同僚と議論しながら、問題に近づく2つの方法があります。どちらもT-SQLスクリプトを介して行われます。
- 選択したテーブルを介して一時テーブルを作成し、古いテーブルをドロップして、適切なデータ型でテーブルを再作成します。インデックスを再作成します。
- 現在のテーブル/データ型を介して変更
ALTER TABLE x ALTER COLUMN Y datetime2
を参照してから、インデックスを再構築または再作成します。
私は自信を持ってデータがきれいに変換するので、#2に傾いています。私の同僚とDBAの友人が#1を好むが、私の同僚はなぜ彼らがそのように彼を訓練したのかを覚えていません。 DBAの友人は休暇中ですので、私はなぜ彼に尋ねなかった。
誰かが彼らがより良いと思うオプションについて洞察を提供することができますか?最終的にそれは私の決断です、そして私はなぜ#1が#2よりも好ましいのか疑問に思いますか?
解決
私は最近これを私たちの組織で何十億+行で扱いたいと思っていました。
アイデアのすべてのクレジットはAaron Bertrandに行き、彼のブログ投稿から来て、トリックショット:スキーマスイッチ - A-RO
小さなテーブルで下記のプロセスをテストし、Prodでする前にあなたの自己快適さを得る。
- 承認
fake
を使用して、2スキーマのshadow
とdbo
を作成します。 -
shadow
スキーマで必要な列とデータ型を含むテーブルを作成します。create table shadow.Correct_Table ...
- データを挿入し、元のテーブルが
shadow
スキーマテーブルにあるすべてのインデックスを作成します。 - このようにして、データとインデックスを持つテーブルのコピーが同じですが、それらは異なるスキーマ(論理的に分離されています)です。
-
shadow
スキーマを使用してテーブル上の統計を更新したら。 -
スキーマを切り替える(これはメタデータ操作で、非常に速い)
--- ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; BEGIN TRANSACTION; ALTER SCHEMA fake TRANSFER dbo.original_table; ALTER SCHEMA dbo TRANSFER shadow.Correct_Table; COMMIT TRANSACTION; ALTER SCHEMA shadow TRANSFER fake.Lookup;
-
すべてが計画通りになったかどうかを確認するための最後の小切手をしてください。
select count(1) from dbo.Correct_table
を実行する必要があります。
-
手順7が確認され、Humping、
shadow.table
、shadow
Schema、およびfake
スキーマをクリーンアップとしてドロップします。
他のヒント
これは私が見る方法です。
#1
- あなたはあなたが完了するまであなたのプロダクションテーブルが使用中に滞在する別のテーブルを使用しているので。それをロックしない(データを読むのに必要なものを超えて)。
- これは@Aaronbertrandが言ったものにも対応しています。
- 必要な列の順序を変更することができます
#2
- それはすべてまたは何もない操作です。あなたが見ていない間に元のテーブルで挿入/変更されたデータを失うことになる可能性はありません。
- オブジェクトに特に割り当てられている権限はすべて守られています。 #1を使用する場合は、スクリプトを確認してこれらを適用する必要があります。
私は通常小さなテーブルのために#2を使うか、停止をすることができるとき(常に手の前にバックアップを取る)、そして#1が停止することができないか列の順序などを再配置してください。#1を実行しようとすると、通常GUIを通じてスクリプトを生成してから、実行する前に慎重に確認します。
ドロップと再作成オプションに注意してください。これにより、sys.dependsを奇数状態で残し、列の順序付けまたは種類が変化しているキャッシュプランに問題が発生する可能性があります。
これらのオブジェクトレベルの権限を維持するためには、次のように任意のオブジェクトレベルの権限を維持する必要があり、後続のDROP
で自動的に再作成されません。
CREATE
はクリーナーオプションIMOですが、プロダクションでそれをできるようにする前に徹底的にテストすることを確認してください。かなりの時間になろう。
私の同僚は、彼が参照していたものについての記事を見つけました:> http:// www。nigelrivett.net/sqladmin/altertableProblems.html 。これを読んで、私たちの年末の報告が上がってきた後、私たちは列の種類を変更しないことにしました、そして今後数カ月の数ヶ月でこれを再考します。私は記事を読んだ後、私はただドロップ/作成方法で行くかもしれません。
これについてのフィードバックのために皆さんに感謝します。私たちが前進することにしたときに考慮する多くの興味深いアプローチ。