sql >> データベース >  >> RDS >> Database

現在利用可能なより多くのオンライン操作–または間もなく

    SQLデータベースでいくつかのテストを実行していて、ONLINE = ONをサポートする少なくとも1つの新しい操作を発見しました 。ちなみに、これはごく最近のバージョンです– SELECT @@VERSION; 引き続き古いビルド番号が生成されますが、証明はビルド日付にあります:

    Microsoft SQL Azure(RTM)– 12.0.2000.8
    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、状態1
    DBCCコマンド'IND'は、このバージョンのSQLServerではサポートされていません。

    そしてsys.dm_db_database_page_allocationsDBCC 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のローカルコピーにも適用される可能性があることを意味します。ただし、他の多くのオンライン操作と同様に、これらはEnterpriseEdition用に予約される傾向があることに注意してください。


    1. 本番環境に対応したデータベース展開に関するDevOpsの考慮事項

    2. opatchの前提条件

    3. Orbeon FormsPostgresDB接続

    4. 列ストアプラン