我正在检查MS SQL事务日志以调查问题,并发现在单个" user_transaction"中的SQL View对象上有大量的LOP_INSERT_ROWS和LOP_DELETE_ROWS操作。持续超过一分钟。
我只是想知道View对象上LOP_INSERT_ROWS和LOP_DELETE_ROWS操作的含义是什么?它们是指创建和删除View对象的操作吗?
感谢。
[2016-05-12更新]
以下是我上面提到的user_transaction(0000:0f20ab9b)。它从10:00:12开始,到10:01:44结束。它在约1.5分钟内产生了超过3,000,000个事务日志操作。此事务的前半部分的99%是PartitionId = 72057594040877056上的LOP_DELETE_ROWS操作,此事务的后半部分的99%是对同一PartitionId的LOP_INSERT_ROWS操作。
因此,我通过以下查询检查了对象名称和属于此PartitionId = 72057594040877056的ID,并且查询显示它是用户视图对象(id = 125243501)。
之前是否有人看过这种症状?
[2016-05-25更新] 视图定义如下所示:
CREATE VIEW [dbo].[get_xxxxxxxxxxxxxxxxxxxxx_vw]
WITH SCHEMABINDING
AS
SELECT Apple.rr_id, Apple.r_date, Apple.r_num, Apple.rr_num,
Apple.h_code, Apple.j_code, Apple.t_code,
Apple.is_scratch, Apple.result, Apple.is_replaced,
Apple.draw, Apple.weight, Apple.rating, Apple.gear,
Orange.s_id, Banana.p_id,
Orange.l_index, Orange.e_index, Banana.c_key,
Grape.price, Grape.ss_id, Grape.price_time, Grape.price_trend, Grape.choice_id,
Banana.c_id
FROM dbo.Apple, dbo.Pear, dbo.Orange, dbo.Grape, dbo.Banana
WHERE Apple.r_date = Pear.curr_r_date
AND Orange.c_id = Banana.c_id
AND Banana.c_id = Grape.c_id
AND Orange.rr_id = Apple.rr_id
(很抱歉,我无法透露所有源代码,但只是扰乱了表名,因为代码不是由我编写的。)
答案 0 :(得分:1)
它是一个正在维护的索引视图。这是完全正常的。
维护的原因是该视图的一个基表已被修改。由于一个基表行可以对应任意数量的视图行,因此写活动可能会爆炸。
您将在基表上执行DML的执行计划中找到索引视图维护。
索引视图权衡DML速度,存储空间和缓冲池占用,以提高查询速度。你决定这是否是一个很好的权衡。
屏幕截图显示了基表中修改的一行(第2行)。这会在视图中导致大量的删除/插入对。这可能是因为基表中的修改值导致行在视图的索引中移动到不同的位置。