我们有一个包含超过300,000,000行和两个单列索引的表。应用程序偶尔会出现这种情况。同时,此表的insert语句存在高索引争用。我也注意到了大量的缓冲区。有人可以帮我解决这个问题吗?
以下是索引争用率很高且我们遇到性能问题时的语句统计信息。
Total Per Execution Per Row
Executions 51,857 1 1.00
Elapsed Time (sec) 3,270.67 0.06 0.06
CPU Time (sec) 1,554.41 0.03 0.03
Buffer Gets 140,844,228 2,716.01 2,716.01
Disk Reads 1,160 0.02 0.02
Direct Writes 0 0.00 0.00
Rows 51,857 1.00 1
Fetches 0 0.00 0.00
相同的陈述,相同的时间范围,相似的工作量。
Total Per Execution Per Row
Executions 94,424 1 1.00
Elapsed Time (sec) 30.41 <0.01 <0.01
CPU Time (sec) 12.90 <0.01 <0.01
Buffer Gets 1,130,297 11.97 11.97
Disk Reads 469 <0.01 <0.01
Direct Writes 0 0.00 0.00
Rows 94,424 1.00 1
Fetches 0 0.00 0.00
答案 0 :(得分:2)
有两种方法可以查看主要索引:
大多数人在第一种意义上考虑主要指数 但是只能有一个主键,因为它是实际的磁盘顺序
通过将序列(或时间戳)作为主键,您基本上是在尝试将记录放得非常接近(同一页面)并且可能会产生争用,因为所有插入都会尝试转到同一个地方
如果您使用主键来分发数据,则插入冲突会更少。即使很少查询该属性,也可以使用具有最可变属性(最接近良好分布)的主键,实际上可以使用添加具有随机值的额外列。
没有提供足够的有关您如何使用数据的信息,但为了避免这些冲突,可能需要交换一些查询时间。