> sp_refresh_single_snapshot_view – @ view_name nvarchar(261)的输入参数,@ rgCode int
> sp_refresh_snapshot_views – @rgCode int的输入参数
sys.messages中的新条目:
> 10149 – 无法在视图’%.* ls’上创建具有SNAPSHOT_MATERIALIZATION的索引,因为视图定义包含内存优化表.
> 10642 – 无法为’%.* ls’上的索引’%.* ls’设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的索引.
> 10643 – 无法为’%.* ls’上的’%.* ls’设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的聚簇索引.
> 10648 – 无法为’%.* ls’上的分区索引’%.* ls’设置SNAPSHOT_MATERIALIZATION.
> 10649 – 无法在具有SNAPSHOT_MATERIALIZATION的聚簇索引’%.* ls’的’%.* ls’上创建非聚簇索引’%.* ls’.
> 10650 – 刷新快照视图需要在数据库上启用快照隔离.
> 3760 – 无法删除具有SNAPSHOT_MATERIALIZATION的视图’%.* ls’上的索引’%.* ls’.
> 4524 – 无法更改视图’%.* ls’,因为它具有快照实现.
> 4525 – 在刷新视图之前,无法在具有快照实现的视图’%.* ls’上使用提示’%ls’.
和新的扩展事件:
那么我们如何创建快照实体化视图呢? (显然,微软还没有记录它.)这是一个没有用的gist with things I’ve tried so far.
解决方法
那说,你可以……
使用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的情况).同样,针对基础表的数据修改不必维护快照索引视图.
EXECUTE sys.sp_refresh_single_snapshot_view @view_name = N'dbo.TH',@rgCode = 0; -- don't know what this is for yet
这会产生执行计划:
这可能对您不起作用,因为需要一个未记录的跟踪标志,或者您需要做我特别讨厌的事情:写入保存功能标志的内存位置(使用调试器)来启用此功能.
如果你很好奇,那么feature标志就是sqllang的字节!g_featureSwitchesLangSvc 0x10f.在sqllang!SpRefreshSingleSnapshotView期间检查它.
如果您想要一起玩,并且已经做好充分的准备,可以接受sql Server代码运行时黑客攻击的后果,并使用Microsoft认为尚未准备好的功能:
>将调试器附加到sql Server 2017进程.我使用的是WinDbg.
>设置断点:
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 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);
结果:
Commands completed successfully.