代码之家  ›  专栏  ›  技术社区  ›  Codek

oracle db writer如何决定是否执行多块/顺序写入

  •  1
  • Codek  · 技术社区  · 16 年前

    我们有一个测试系统与我们的生产系统完全匹配。6个月前,我们对新硬件进行了一些测试,发现了系统的性能极限。

    然而,现在我们正在进行测试,以期添加更多的硬件,我们发现系统并不像以前那样运行。

    原因是,在一个特定的卷上,我们现在正在执行以前是顺序的随机I/O。除此之外,oracle在这个卷上的活动(100%写入)实际上是在8k块中,在它之前高达128k块。

    所以有些事情导致oracle db writer停止批量处理它的写操作。

    我们已经广泛检查了配置,看不到测试系统和生产系统之间的任何区别。我们还与甲骨文打过电话,但在现阶段,信息的提供速度很慢。

    所以,归根结底,这是两个相关的问题:

    1. 您可以依赖oracle多块写入吗?对你的系统进行设计/调试安全吗?
    2. 甲骨文为什么要改变自己的行为?

    OS/arch是solaris/sparc。

    哦;我忘了说,insert表没有索引,只有几个外键——它被设计成一个桶,可以尽可能快地插入。它还在密钥字段上进行分区。

    谢谢你的建议!

    1 回复  |  直到 16 年前
        1
  •  1
  •   Gary Myers    16 年前

    对工作量的更多描述将允许一些假设。

    如果您正在更新随机块,那么DBWR进程将没有什么选择,只能进行单块写入。尤其是索引很可能到处都是写操作。如果您有一个字符值的索引,并且需要在没有空间的地方插入一个新的'M'记录,它将为索引获取一个新块并拆分当前块。在原始块中会有一些'M'记录,在新块中会有一些记录(而这将是最后一个区段中最后一个[使用过的]块)。

    我怀疑当批量插入到表中时,最有可能得到多个块写入,因为新的块将被分配和写入。可能,最初您已经(比如)分配了1GB的扩展数据块并正在写入该空间。现在,您可能已经达到了这个限制,并且正在创建新的扩展数据块(比如50MB),它可能是从分散的文件位置(例如其他已删除的表)获取的。