Oracle对高容量写入和低容量读取的建议

时间:2008-10-11 17:32:37

标签: database oracle database-design

在线是否有一些关于如何调整oracle以进行大量插入和少量读取的一般指导原则?

以下所有答案都是非常好的建议。我必须澄清以下事项。我使用的是10g,这是我们使用Oracle的绝对要求。我也对用于调优的oracle实例参数(可能是一些不同的锁定策略)更感兴趣。

5 个答案:

答案 0 :(得分:2)

让我假设您想要进行过多的插入操作,因此您只需要忽略所有其他类型的操作,只是为了完成这些插入,而不会出现问题。

首先,您是否完全排除了其他类型的数据库?像工业数据库这样的系统可以很好地处理大量插入,通常用于接收和存储在工厂环境中测量某些东西的设备的数据。 Oracle是一个关系数据库,它可能不是满足您需求的正确软件类型。

话虽如此,我们假设您可以,或将会或应该使用Oracle。您需要做的第一件事是考虑您做出此假设所需的所有各种类型的数据。如果它们都是相同类型的数据,那么您需要1个表格,并且它需要精简并且意味着插入。

最佳方法是执行以下操作:

  1. 根本不要在此表上添加任何索引,如果您需要主键,那么这是您想要的唯一索引
  2. 如果您需要对此表执行读操作,请考虑使用包含您执行读取,查找和聚合的索引的影子表。如果不必更新到毫秒级,请考虑定期批处理作业,以使用主表中的数据对其进行更新。这将使用尽可能少的读锁来干扰主表
  3. 确保您的服务器具有快速磁盘。事务性写入操作通常会在某个时刻涉及磁盘,因此请确保这是一个小瓶颈。
  4. 如果您的应用程序正在从许多传入源收集数据,请考虑在数据库前添加一个层,以保持并发连接数,从而将该表的事务保持在最低限度。如果在oracle数据库的同一页面上获得大量写锁定,最终会使您的性能受损。
  5. 如果您可以拆分数据,请考虑将其拆分,使其存储在不同的物理磁盘上。这样,磁盘I / O问题就不会是跨数据类型的,只会影响一种类型的数据。

    在光谱的另一端,你有一个非规范化的表,其中有许多索引针对查找和更新之间的平衡进行了优化,你需要找到一些可以获得所需性能的中间方法。

答案 1 :(得分:1)

就数据库设计而言,尽可能少的约束,索引和触发器插入到这些表中会降低插入速度。

缺少索引会明显损害您的SELECT性能,但听起来这并不是您主要关注的问题。

答案 2 :(得分:0)

我们在谈论什么样的应用?什么版本的Oracle?

例如,如果您正在设计数据仓库加载过程,通常需要将直接路径插入到临时表中,然后构建任何必要的索引,然后执行分区处理以将数据加载到分区目标表。当然,如果您正在进行单行插入,这也不会起作用。

根据Oracle版本和应用程序类型,您可能还希望在表上启用压缩。从CPU的角度来看,插入通常很便宜,因此可能有足够的CPU可用于压缩,这可以大大减少所需的I / O量,这通常是您的瓶颈。

答案 3 :(得分:0)

我建议您将问题提交给Tom Kyte的网站 http://asktom.oracle.com 。你通常可以在那里找到答案。否则,请尝试 Oracle's forums

还可以尝试查找任何Tom Kyte的书籍。建议检查图书馆或当地书店以找到合适的书店,以确保书中包含适合您的主题。此外, his blog 可以链接到他的书籍以及每本书的一些文章/讨论。

我做了一个快速谷歌,网站:oracle.com调优写,并找到了这个 的 OracleAS TopLink Writing Optimization Features 即可。我意识到你可能没有使用TopLink,但它可能有一些很好的提示。您想要尝试使用的关键字:调整,性能,插入,改进。通过您使用的技术,如java / c ++ / etc。

您可以尝试的其他提示:

  • 使用存储过程或以更有效的方式使用它们。
  • 调整服务器的硬件。更快的硬盘驱动器或特定的RAID阵列,可能更多的CPU。
  • Ask Tom thread - 这里有一些不错的评论,也链接到 Fowler's site

您可能必须开始在查询/实施上运行一些性能分析,以找到每个查询/最佳位置的最佳位置。我希望我能给你一个简单的答案。祝好运!

答案 4 :(得分:0)

有几条建议供您进一步研究: -

  • 直接路径加载
  • 阻止压缩