加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 如安在SQL Server 2017中行使SNAPSHOT_MATERIALIZ

发布时间:2021-05-22 09:08:28 所属栏目:编程 来源:网络整理
导读:SQL Server 2017有几个新的存储进程: sp_refresh_single_snapshot_view – @ view_name nvarchar(261)的输入参数,@ rgCode int sp_refresh_snapshot_views – @rgCode int的输入参数 sys.messages中的新条目: 10149 – 无法在视图’%.* ls’上建设具有SNAP

SQL Server 2017有几个新的存储进程:

> 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.

办理要领

你不能.该成果在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

这会发生执行打算:

这也许对您不起浸染,由于必要一个未记录的跟踪符号,可能您必要做我出格厌恶的工作:写入生涯成果符号的内存位置(行使调试器)来启用此成果.

假如你很好奇,那么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.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读