sp_refresh_single_snapshot_view – @view_name nvarchar(261),@ rgCode int的输入参数
sp_refresh_snapshot_views – @rgCode int的输入参数br />
以及sys.messages中的新条目:
10149 –无法在视图'%。* ls'上创建具有SNAPSHOT_MATERIALIZATION的索引,因为视图定义包含内存-优化的表。
10642 –无法为'%。* ls'上的索引'%。* ls'设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的索引。
10643 – SNAPSHOT_MATERIALIZATION不能为在'%。* ls'上设置为'%。* ls',因为它仅适用于视图上的聚集索引。
10648 –无法为在'%。*上的分区索引'%。* ls'设置SNAPSHOT_MATERIALIZATION。 ls'。
10649 –无法在具有SNAPSHOT_MATERIALIZATION的聚集索引'%。* ls'的'%。* ls'上创建非聚集索引'%。* ls'。
10650 –刷新快照视图(s)需要启用快照隔离o在数据库中。
3760 –无法在具有SNAPSHOT_MATERIALIZATION的视图'%。* ls'上删除索引'%。* ls'。
4524 –无法更改视图'%。* ls',因为它具有快照
4525 –刷新视图之前,无法在具有快照实现的视图'%。* ls'上使用提示'%ls'。
以及新的扩展事件:
那么如何创建快照实现的视图? (显然,微软尚未对此进行记录。)这是我迄今为止尝试过的尚未解决的要点。
#1 楼
你不能该功能已在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一样)。同样,对基础表的数据修改也不必维护快照索引视图。
要刷新视图内容,需要调用新的存储过程之一:
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认为不起作用的功能准备就绪:
将调试器附加到SQL Server 2017进程。我使用WinDbg。
设置断点:
使用Go命令(
g
)恢复SQL Server(sys.sp_refresh_single_snapshot_view
)创建视图上面的,但还没有唯一的聚集索引
在上面运行
sqllang!g_featureSwitchesLangSvc+0x114
命令遇到断点时,请逐步执行直到看到代码行:
bp sqllang!SpRefreshSingleSnapshotView
其他版本中的偏移量可能不同,例如,在2017 RTM CU3中,偏移量为
SNAPSHOT_MATERIALIZATION
。括号内的内存地址可能不同。使用显示的内存。
使用display memory命令查看找到的内存地址的当前值:
cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0
这应该显示零,表示该功能已禁用。
使用enter values命令(再次使用您的内存地址)将零更改为1:
db 00007fff`328dfbcf L1
禁用断点并继续运行SQL Server。
现在启用了该功能。
在视图上构建唯一的聚簇索引。
播放。
注意
MAX
允许我们具体化查询规范的快照通常无法建立索引,例如以下使用q4312079q:eb 00007fff`328dfbcf 1
结果:
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);