2008-10-11 41 views
2

是否有一些关于如何调整oracle以执行大量插入和少量读取的一般性指导?针对大量写入和低容量读取的Oracle建议

以下所有答案都是非常好的建议。我必须澄清以下几点。我使用10g,这是我们使用Oracle的绝对要求。我也更喜欢用于调优的oracle实例参数(也许有些不同的锁定策略)。

+0

在参数或DB设计方面:-) – cagcowboy 2008-10-11 17:34:31

回答

1

就数据库设计而言,尽可能少地插入表中的约束条件,索引和触发器,因为这些都会减慢插入速度。

缺乏索引显然会伤害您的SELECT性能,但听起来不像这是您的主要担忧。

0

我们在谈论什么样的应用?什么版本的Oracle?例如,如果您正在设计数据仓库加载过程,那么您通常希望直接插入到临时表中,然后构建任何必需的索引,然后执行分区扩展以将数据加载到分区目标表。当然,如果您正在进行单行插入,这也不会奏效。

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

2

让我假设您想要执行过多的插入操作,这样您只需简单地忽略所有其他类型的操作即可完成插入操作,而不会出现任何问题。

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

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

的最佳方式做到这一点是要做到以下几点:

  1. 不要在这个表上添加任何索引可言,如果你需要一个主键,这就是你想要的唯一指标
  2. 如果您需要对这张表进行读取操作,考虑让影子表具有您读取,查找和汇总的索引。如果这不需要更新达到毫秒,请考虑定期批量作业使用主表中的数据更新它。这将尽可能少地使用读锁来扰乱主表
  3. 确保您的服务器具有快速磁盘。事务性写入操作通常会涉及到某个时刻的磁盘,因此请确保这是一个小瓶颈,因为您可以获得。
  4. 如果您的应用程序正在收集来自多个传入来源的数据,请考虑在数据库前添加一个图层,以保持并发连接的数量,从而将该表的事务保持在最低限度。如果您在Oracle数据库的同一页面上获得大量写锁,最终您的性能将会受到影响。

如果您可以拆分数据,请考虑将其拆分,使其存储在不同的物理磁盘上。这样,磁盘I/O问题将不会是交叉数据类型,只会影响一种类型的数据。

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

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

你可能将不得不开始运行您的查询/实现的一些性能分析,找到甜蜜点各一个。我希望我能为你解答一个简单的问题。祝你好运!

0

一对夫妇的建议,为你寻找到进一步: - (或两者)

  • 直接路径负载
  • 块压缩