できません。この機能は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がまだ準備ができていないと思われる機能を使用した結果を受け入れる準備ができている場合:
- SQL Server 2017プロセスにデバッガーを接続します。WinDbgを使用します。
ブレークポイントを設定します。
bp sqllang!SpRefreshSingleSnapshotView
Goコマンド(g
)を使用してSQL Serverを再開します
- 上記のビューを作成しますが、一意のクラスター化インデックスはまだ作成しません
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 valuesコマンドを使用して、ゼロを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);
結果:
コマンドは正常に完了しました。