我正在使用Oracle数据库的两个实例,称它们为one
和two
。 two
运行在比one
更好的硬件(硬盘,内存,CPU)上,two
是Oracle版本one
背后的一个次要版本(均为11g) )。两者都具有完全相同的表table_name
,并且定义了完全相同的索引。我在两个实例上将{500}个相同的行加载到table_name
。然后我在两个实例上运行:
delete from table_name;
此命令在one
上完成需要30秒,在two
上需要40分钟才能完成。对两个表执行INSERT和UPDATE具有类似的性能差异。有没有人对可能对两个数据库之间的性能产生如此巨大影响的建议有什么建议?
答案 0 :(得分:3)
我首先比较实例配置 - 从V $ PARAMETER ORDER BY NAME中选择NAME和VALUE,并将结果假脱机为两个实例的文本文件,并使用一些文件比较工具突出显示差异。应调查除数据库名称和文件位置引起的差异之外的任何其他内容。极端情况可能是没有在一个数据库上记录归档,而在另一个数据库上定义了5个归档目标。
如果您无权访问数据库主机上的文件系统,请找一个做过的人并让他们从启动会话时获取跟踪文件和tkprof结果,ALTER SESSION SET sql_trace = true,然后执行删除操作。这将暴露由于表上的触发器(您可能不拥有),审计等引起的任何递归SQL。
答案 1 :(得分:2)
如果您可以监视v $ session中的wait_class和event列以获取删除会话,您将获得有关延迟原因的线索。通常我希望全表DELETE是磁盘绑定的(等待类指示I / O或可能是配置)。它必须从表中读取数据(因此它知道要删除的内容),更新数据块和索引块以删除为UNDO表空间和重做日志生成大量条目的条目。
在生产环境中,底层文件可能分布在多个磁盘(甚至是SSD)上。开发/测试环境可能会将它们全部卡在一个设备上,并且磁盘上的大量磁头移动会降低速度。我可以看到跳SQL可能十倍。你的比这更糟糕。
如果表上存在并发活动[wait_class of“Concurrency”](例如其他会话插入),您可能会遇到锁定争用,或者会话都试图敲定索引。
答案 2 :(得分:1)
我的办公室窗口上写着以下内容:
如遇紧急情况,请致电dba:
第2号和/或第3号通常会修复在一个数据库中工作但不在另一个数据库中工作的查询或昨天工作但今天不工作的查询....
答案 3 :(得分:1)
实例 two 中显然有些错误。我建议你看一下这些问题及其答案:
特别是: