具有高缓冲区的插入语句获得高索引争用

时间:2014-02-11 18:32:35

标签: performance oracle

我们有一个包含超过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

1 个答案:

答案 0 :(得分:2)

有两种方法可以查看主要索引:

  1. 一种快速查找最常见查询的方法
  2. 一种加速插入(并且可以删除)的方法
  3. 大多数人在第一种意义上考虑主要指数 但是只能有一个主键,因为它是实际的磁盘顺序

    通过将序列(或时间戳)作为主键,您基本上是在尝试将记录放得非常接近(同一页面)并且可能会产生争用,因为所有插入都会尝试转到同一个地方

    如果您使用主键来分发数据,则插入冲突会更少。即使很少查询该属性,也可以使用具有最可变属性(最接近良好分布)的主键,实际上可以使用添加具有随机值的额外列。

    没有提供足够的有关您如何使用数据的信息,但为了避免这些冲突,可能需要交换一些查询时间。