问题
通过在每次更新时插入一个旧行和一个新行,审计触发器正在扼杀我的批量更新查询的性能。
在这个触发器中,由于某种原因,旧行的插入比插入新行需要更多的时间。
桌子
审计表有一个集群索引,3 个非集群索引,它有大约 3500 万条记录。
Cluster Index
GROUPID , USERID, IDENDITYCOLUMN
事实
旧行可以插入聚簇索引中的任何位置
新行将插入聚集索引的底部
调查
我测试的是 Cache 在这个操作中可以提高很多性能,但是我没有弄清楚到底需要缓存什么。
假设
我假设聚集索引是插入操作中最相关的索引。
我假设通过对聚集索引的正确页面进行查询,可以大大提高审计性能
行动
我创建了一个查询来加载与我要在操作表上插入的行相关的所有审计行。通过这样做,性能提高了 2 倍多一点,但还不够好。
为什么不够好?
我做了另一个性能更高的测试,但我没有弄清楚我到底需要缓存什么。
那次测试怎么样?
T01 - 来回测试
我从操作表中抓取 1000 行并来回更新它们,看看我是否从审计表中获得了惊人的缓存性能。
A) I have updated GROUPID of 1000 rows to value X (it took a while)
B) I have updated GROUPID of the same 1000 rows to value Y (it took a while)
C) I have updated GROUPID of the same 1000 rows to value X (astonishing cache performance)
D) I have updated GROUPID of the same 1000 rows to value Y (astonishing cache performance)
T02 - 在更新操作表时检查缓存在审计表上的对象
然后我清理了审计缓存、索引缓存和数据缓存,并再次执行 T01 - A)。
我发现集群索引页面和数据页面都加载了,并且数量大致相同,并且在其他索引中加载了剩余数量的页面。
T03 - 运行我的人工缓存加载查询时,检查缓存在审计表上的对象
然后我清理了审计缓存并运行了我的查询。与测试 T02 相比,它只加载了大约一半的页面。
我对我的人工缓存加载查询应用了什么逻辑?
我假设如果我查询审计表中的所有行,其中 GROUPID 和 USERID 存在于 1000 行中以进行更新(在操作表中),我将加载以缓存所有聚集索引和数据页,这些索引和数据页需要从审计触发器中获得出色的性能。
Cluster Index
GROUPID , USERID, IDENDITYCOLUMN
然而事实并非如此,因为与测试 T02 相比,我加载了一半的页面。
问题 我可以怎样做才能在第一次获得测试 T01 - C) 或 D) 的表现?我只能在预缓存数据/索引页面时想到,但我无法找出究竟缺少什么。
如果你们有其他改进审计表触发器的建议,它也很有价值。
数据库
SYBASE 15.7
注意:这是一个属于特定产品解决方案的表格,这意味着我无法随意更改它。我有一些限制。