SQL Server 2017でSNAPSHOT_MATERIALIZATIONを使用してビューを作成するにはどうすればよいですか?


36

SQL Server 2017には、いくつかの新しいストアドプロシージャがあります。

  • sp_refresh_single_snapshot_view – @view_name nvarchar(261)、@ rgCode intの入力パラメーター
  • sp_refresh_snapshot_views – @rgCode intの入力パラメーター

sys.messagesの新しいエントリ:

  • 10149-ビュー定義にメモリ最適化テーブルが含まれているため、SNAPSHOT_MATERIALIZATIONを持つインデックスをビュー '%。* ls'に作成できません。
  • 10642-SNAPSHOT_MATERIALIZATIONは、ビューのインデックスにのみ適用されるため、 '%。* ls'のインデックス '%。* ls'に設定できません。
  • 10643 – SNAPSHOT_MATERIALIZATIONは、ビューのクラスター化インデックスにのみ適用されるため、 '%。* ls'の '%。* ls'に設定できません。
  • 10648 – SNAPSHOT_MATERIALIZATIONは、 '%。* ls'のパーティションインデックス '%。* ls'に設定できません。
  • 10649-SNAPSHOT_MATERIALIZATIONのクラスター化インデックス '%。* ls'を持つ '%。* ls'には非クラスター化インデックス '%。* ls'を作成できません。
  • 10650 –スナップショットビューを更新するには、データベースでスナップショット分離を有効にする必要があります。
  • 3760 – SNAPSHOT_MATERIALIZATIONを持つビュー '%。* ls'のインデックス '%。* ls'を削除できません。
  • 4524 –ビュー '%。* ls'にはスナップショットマテリアライゼーションがあるため変更できません。
  • 4525 –ビューが更新される前に、スナップショットマテリアライゼーションを持つビュー '%。* ls'でヒント '%ls'を使用できません。

新しい拡張イベント:

スナップショットビューの拡張イベント

では、どのようにしてスナップショットマテリアライズドビューを作成できますか?(明らかに、Microsoftはまだそれを文書化していません。)ここに、私が今まで試したがうまくいかなかったことの要点を示します。

回答:


55

できません。この機能は2017 RTMで無効になっています。


とはいえ、次のことができます...

AdventureWorksの使用:

CREATE VIEW dbo.TH
WITH SCHEMABINDING
AS
SELECT P.ProductID, COUNT_BIG(*) AS cbs
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
    ON TH.ProductID = P.ProductID
GROUP BY P.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

基になるテーブルへの変更は、ビューにすぐには反映されません(通常、SQL Serverの場合)。同様に、基礎となるテーブルに対するデータ変更は、スナップショットインデックス付きビューを維持する必要はありません。

ビューの内容を更新するには、新しいストアドプロシージャの1つを呼び出す必要があります。

EXECUTE sys.sp_refresh_single_snapshot_view
    @view_name = N'dbo.TH',
    @rgCode = 0; -- don't know what this is for yet

これにより、実行計画が作成されます。

計画

文書化されていないトレースフラグが必要か、この機能を有効にするために機能フラグを保持しているメモリ位置への書き込み(デバッガーを使用)を行う必要があるため、これはおそらく機能しません。

興味があれば、機能フラグはのバイトsqllang!g_featureSwitchesLangSvc+0x10fです。の間にチェックされsqllang!SpRefreshSingleSnapshotViewます。

SQL Serverの実行中にSQL Serverのコードをハッキングし、Microsoftがまだ準備ができていないと思われる機能を使用した結果を受け入れる準備ができている場合:

  1. SQL Server 2017プロセスにデバッガーを接続します。WinDbgを使用します。
  2. ブレークポイントを設定します。

    bp sqllang!SpRefreshSingleSnapshotView
  3. Goコマンド(g)を使用してSQL Serverを再開します

  4. 上記のビューを作成しますが、一意のクラスター化インデックスはまだ作成しません
  5. sys.sp_refresh_single_snapshot_view上記のコマンドを実行します
  6. ブレークポイントに到達したら、コード行が表示されるまでステップ実行します。

    cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0

    オフセットは他のビルドでは異なる場合があります。たとえば、2017 RTM CU3では sqllang!g_featureSwitchesLangSvc+0x114

  7. 括弧内のメモリアドレスは異なる場合があります。表示されているものを使用してください。

  8. display memoryコマンドを使用して、見つけたメモリアドレスの現在の値を確認します。

    db 00007fff`328dfbcf L1
  9. 機能が無効になっていることを示すゼロが表示されます。

  10. enter valuesコマンドを使用して、ゼロを1に変更します(再びメモリアドレスを使用します)。

    eb 00007fff`328dfbcf 1
  11. ブレークポイントを無効にして、SQL Serverの実行を再開します。

  12. これで機能が有効になりました。
  13. ビューで一意のクラスター化インデックスを構築します。
  14. 遊びましょう。

注をSNAPSHOT_MATERIALIZATION使用すると、通常はインデックスを作成できなかったクエリ仕様のスナップショットを具体化できます。たとえば、次のように使用しますMAX

CREATE VIEW dbo.TH2
WITH SCHEMABINDING
AS
SELECT TH.ProductID, MaxTransactionID = MAX(TH.TransactionID)
FROM Production.TransactionHistory AS TH
GROUP BY TH.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH2 (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

結果:

コマンドは正常に完了しました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.