10

Column宣言されている列がNULL DEFAULT(GETUTCDATE())あり、この列を含む非クラスター化インデックスがあります。この列を次のように変更したいのですが、ステートメントNOT NULL DEFAULT(GETUTCDATE())を実行するALTER TABLE ALTER COLUMNと、SQL Azure サービスは、この列に依存するインデックスがあるため、列を変更できないと言います。

これは運用データベースで、テーブルには約 1,000 万のレコードが保持されます。したがって、データベースの速度が低下するため、インデックスを削除して再作成したくありません (特に、インデックスの作成には数分かかる場合があります)。

インデックスを再作成せずに列を変更するにはどうすればよいですか?

4

1 に答える 1

9

NOT NULL を適用するためにテーブル列を変更する必要はありません。代わりに、新しい制約をテーブルに追加できます。

ALTER TABLE [Table] WITH CHECK
   ADD CONSTRAINT [TableColumnNotNull] CHECK ([Column] Is NOT NULL);

これはインデックスには影響しませんが、オプティマイザーはこの制約を使用してパフォーマンスを向上させます。

CREATE TABLE Test (ID bigint PRIMARY KEY, [Column] DATE NULL DEFAULT(GETUTCDATE()));
GO --< Create test table

CREATE NONCLUSTERED INDEX TestColumnIdx ON Test ([Column]);
GO --< Create the index

ALTER TABLE Test ALTER COLUMN [Column] DATE NOT NULL;
GO --< That won't work: the index 'TestColumnIdx' is dependent on column 'Column'

Select * From Test Where [Column] Is NULL;
GO --< Check the plan: it has "Index Seek (NonClustered)"

ALTER TABLE Test WITH CHECK ADD CONSTRAINT TestColumnNotNull CHECK ([Column] Is NOT NULL);
GO --< Add a "stand-alone" NOT NULL constraint

Select * From Test Where [Column] Is NULL;
GO --< Check the plan: it has "Constant Scan" now

DROP TABLE Test;
GO --< Clean-up
于 2016-05-20T09:58:32.823 に答える