背景
我有一个单元测试框架,它为我的单元测试创建实体,执行测试,然后自动删除实体。除了在我们的开发环境中删除某些实体需要 15 - 30 秒之外,它一直运行良好。
我最近在 Amazon Cloud 中收到了一个 VM 设置,用于执行一些需要几个发布周期才能完成的长期更改。当我在 VM 上运行单元测试时,我不断收到试图删除实体的 SQL 超时错误。
脚步
我已经完成了这组发现/操作步骤:
- 打开跟踪,看到
fn_CollectForCascadeWrapper
用于处理级联删除的超时正在发生。我的单元测试中只有 6 个实体,它们被删除的方式不需要级联删除。Ran Estimated Execution Plan 并添加了它要求的一些索引。这仍然没有解决超时问题。 - 打开 VM 上的资源管理器以查看磁盘访问/内存/CPU。当我尝试删除时,CPU 在 2 秒内达到 20%,然后下降到接近 0。内存没有变化,但资源管理器上的磁盘读取访问变得疯狂,并保持这种状态 7-10 分钟。
- 硬编码
fn_CollectForCascadeWrapper
以返回结果,这意味着我的单元测试中的 6 个实体不需要级联。运行单元测试并再次得到 SQL 超时错误。根据跟踪,实际删除语句超时:
delete from [New_inquiryExtensionBase] where ([New_inquiryId] = '7e250a5f-890e-40ae-9d2d-c55bbd7250cd');
delete from [New_inquiryBase]
OUTPUT DELETED.[New_inquiryId], 10012
into SubscriptionTrackingDeletedObject (ObjectId, ObjectTypeCode)
where ([New_inquiryId] = '7e250a5f-890e-40ae-9d2d-c55bbd7250cd')
- 在 SQL Management Studio 中手动运行查询。花了大约 3 分钟完成。表上没有触发器,所以我认为时间一定是由于插入。看了
SubscriptionTrackingDeletedObject
看表,发现里面有 2100 条记录。删除表中的所有记录,并重新运行我的单元测试。它实际上在正常的 15-30 秒时间范围内进行删除。 - 研究并发现了
SubscriptionTrackingDeletedObject
它的用途,并且异步服务清理了它。注意到异步服务没有在服务器上运行。开启服务,等了10分钟,再次查询表。我的 6 个实体仍然列在那里。查看跟踪日志并看到超时错误:Error cleaning up Principal Object Access Table
- 研究了 POA 并
SELECT COUNT(*)
在 table 上执行了一个,7 分钟后它返回了2.61 亿条记录!研究了如何清理桌子,我发现的唯一东西是角色升级 6(我们目前在 11)。
接下来是什么?
POA 会影响删除吗?或者仅仅是影响删除的异步服务的 POA?插入SubscriptionTrackingDeletedObject
真的会导致我的问题吗?