SQLデータベースでいくつかのテストを実行していて、ONLINE = ON
をサポートする少なくとも1つの新しい操作を発見しました 。ちなみに、これはごく最近のバージョンです– SELECT @@VERSION;
引き続き古いビルド番号が生成されますが、証明はビルド日付にあります:
2015年2月12日00:53:13
Copyright(c)Microsoft Corporation
このバージョンのAzureSQLデータベースは、ONLINE = ON
をサポートしています。 ALTER TABLE ... ALTER COLUMN
のオプション 。
null許容列のあるテーブルがあるとします:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
そして今、あなたはその列をnull許容にしないことに決めました、あなたはこれをすることができます(NULL
がないと仮定して) s):
ALTER TABLE dbo.a ALTER COLUMN x VARCHAR(255) NOT NULL WITH (ONLINE = ON);
照合、データ型、列のサイズを変更するなどの操作もできます。
ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) -- changed data type and length COLLATE Albanian_BIN NOT NULL -- changed collation and nullability WITH (ONLINE = ON);
SQL Serverの現在のバージョン(および以前のバージョンのAzure SQL Database)では、ONLINE = ON
ALTER TABLE
ではヒントはサポートされていません 、およびオプションがない場合、これはブロッキングおよびデータサイズの操作でした。公平を期すために、初めてコードを実行したときは、ONLINE = ON
のバージョンしか証明できませんでした 宣伝どおりに機能したわけではなく、正常に実行されました。
このコードをONLINE = ON
で実行しました なし:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects; -- placeholder; ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) COLLATE Albanian_BIN NOT NULL -- WITH (ONLINE = ON); -- placeholder; DROP TABLE dbo.a;
--placeholder
内 スポット、動作の違いを判断するためにいくつかのことを試みました(これは、本番SQLデータベースであったため、違いが明らかになるほど十分なデータを使用したり、十分なアクティビティを作成したりしたくありませんでした)。両方のシナリオで、ページが変更されたかどうか(真のオンライン操作を示す)、または既存のページの値が更新されたかどうか(それほどオンラインではない操作を示す)を確認したいと思いました。テストを拡張して、ページがいっぱいであるか、255文字すべてが使用されている場合に、新しいページがいくつ作成されるかを確認することもできますが、ページが変更されたかどうかを確認するだけで十分だと思いました。
DBCC IND()
を試しました :
DBCC IND(N'dbname', N'dbo.a', 1, 1);
ここでの結果は驚くべきものではありませんでした:
メッセージ40518、レベル16、状態1DBCCコマンド'IND'は、このバージョンのSQLServerではサポートされていません。
そしてsys.dm_db_database_page_allocations
(DBCC IND
の代わり ):
SELECT allocated_page_page_id FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED') WHERE is_iam_page = 0;
これにより、空の結果セットが生成されました。この動的管理機能がAzureSQLデータベースの物理情報を公開しないのは設計によるものだと思います。
次に、fn_PhysLocCracker
でトリックを試しました 、Michelle Ufford(@sqlfool)のような人々が以前にブログに書いたことがある:
SELECT l.page_id FROM dbo.a OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;
成功!これにより、dbo.a
に対するスキャンで使用されたページの値が返されました。 、そしてONLINE = ON
では明らかです バージョンでは、データは新しいページに移動され(おそらく、操作全体で古いページが利用可能のままになります)、ヒントがない場合、データとメタデータはその場で更新されます:
標準のALTERCOLUMN動作(左)とONLINE =ON(右)でのページの比較
私が比較したかったもう一つのことは、実行計画でした。 Management Studioにはあまり表示されないかもしれませんが、SQL Sentry Plan Explorer Proでは、一部のDDLコマンドの舞台裏で行われていることを含む完全な呼び出しスタックを確認できます。私たちのツールは期待を裏切りませんでした。インプレース更新のバリエーションの実際の計画は提示されていませんが、ONLINE = ON
を使用すると動作に大きな違いがあることも示しています。 :
標準のALTERCOLUMN動作(左)とONLINE =ON(右)でのプランの比較
もちろん、この違いは、最近更新されたドキュメントでオンライン操作に必要な他のすべての条件(多くはオンラインインデックスの再構築の要件に類似しています)を満たしている場合にのみ表示されます。
さて、SQLデータベースを使用していない場合、それはどのように役立ちますか?結局のところ、この構文はSQL Server 2014 Cumulative Update#6(12.0.2480)でも正しく解析されません。ええと、Microsoftは、開発パターンが「クラウドファースト、次にボックス」になったという事実を正確に守っていません。MarkSouzaが、Azure SQL Databaseで最初に導入された新しい行レベルのセキュリティ機能についてツイートしたときに最近示唆したように:
>
行レベルのセキュリティ。 #sqlserverコミュニティから多くのことを求められました。 http://t.co/pp0sNr8Nt5最初にクラウドですが、それが何を意味するかはご存知でしょう。来ています
— Mark Souza(@mark_AzureCAT)2015年2月8日
これは、これらのオンライン操作が、近いうちにSQLServerのローカルコピーにも適用される可能性があることを意味します。ただし、他の多くのオンライン操作と同様に、これらはEnterpriseEdition用に予約される傾向があることに注意してください。