SQL Server 2017には、いくつかの新しいストアドプロシージャがあります。
そして、sys.messagesの新しいエントリ:
そして、新しい拡張イベント:
それでは、どのようにしてスナップショットマテリアライズドビューを作成できますか? (Microsoftはまだそれを文書化していません。)これが これまでに試したものの要点 機能していません。
つまり、次のことができます...
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のコードを実行中にハッキングして、Microsoftがまだ準備ができていないと思われる機能を使用した結果を受け入れる準備が整っている場合:
ブレークポイントを設定します。
bp sqllang!SpRefreshSingleSnapshotView
Goコマンドを使用してSQL Serverを再開する(g
)
sys.sp_refresh_single_snapshot_view
コマンドを実行しますブレークポイントに到達したら、コード行が表示されるまでステップ実行します。
cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0
オフセットは他のビルドでは異なる場合があります。たとえば、2017 RTM CU3ではsqllang!g_featureSwitchesLangSvc+0x114
括弧内のメモリアドレスは異なる場合があります。表示されているものを使用してください。
Display memoryコマンドを使用して、見つかったメモリアドレスの現在の値を確認します。
db 00007fff`328dfbcf L1
これはゼロを示し、機能が無効であることを示します。
Enter値コマンドを使用して(ここでもメモリアドレスを使用して)、ゼロを1に変更します。
eb 00007fff`328dfbcf 1
ブレークポイントを無効にして、SQL Serverの実行を再開します。
注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);
結果:
コマンドは正常に完了しました。