当我尝试从包含两个CLOB字段的表中删除行时,我遇到了Oracle非常慢的问题。该表具有数百万行,没有约束,删除基于主键。我重建了索引和重新计算的统计数据,但没有用。
如何提高此表中删除的效果?
答案 0 :(得分:2)
跟踪它,启用等待
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_monitor.htm#i1003679
在UDUMP目录中查找跟踪文件。 TKPROF吧。 查看结尾,它将告诉您数据库在SQL期间花费了多少时间。以下链接概述了如何分析性能问题。
http://www.method-r.com/downloads/doc_download/10-for-developers-making-friends-with-the-oracle-database-cary-millsap
答案 1 :(得分:1)
使用Oracle时,您必须考虑删除行时生成的重做次数。如果CLOB字段非常大,Oracle可能需要一段时间才能删除它们,因为重写的数量很多,而且可能没有太多可以做的。
您可能执行的测试是查看删除是否在一行上花费很长时间,其中两个CLOB字段都设置为null。如果是这种情况,则可能是索引更新需要很长时间。如果是这种情况,如果可能发生删除,则可能需要调查合并索引。
如果表是派生表,意思是,它可以从其他表重建,您可以查看表中的NOLOGGING选项。您可以使用最少的日志记录从源表重建表。
我希望这个条目有所帮助,但是更多细节可以帮助诊断问题。
答案 2 :(得分:1)
是否有任何子表引用此表从中删除? (您可以从user_constraints
中选择,其中r_constraint_name
=您要删除的表上的主键名称。)
如果Oracle需要查看另一个表以检查没有子记录,则删除速度可能会很慢。通常的做法是索引子表上的所有外键,这样就不会有问题了。
按照Gary的建议,执行追踪并发布TKPROF结果,以便有人能够进一步提供帮助。
答案 3 :(得分:1)
您的UNDO
表空间似乎是这种情况下的瓶颈。
检查删除数据后创建ROLLBACK
所需的时间。如果需要的时间与查询本身的时间相当(在50%
内),那么情况确实如此。
当您执行DML
查询时,您的数据(原始数据和已更改数据)将写入重做日志,然后应用于数据文件和UNDO
表空间。
删除数百万CLOB
行需要将数百兆字节(如果不是千兆字节)复制到UNDO
表空间,这需要几十秒钟。
你能做些什么呢?
UNDO
:将其放在单独的磁盘上,使其更少稀疏(创建更大的数据文件)。ROLLBACK SEGMENTS
代替托管UNDO
,为此查询分配ROLLBACK SEGMENT
,并在运行查询前发出SET TRANSACTION USE ROLLBACK SEGMENT
。如果不是这样,我。即ROLLBACK
比查询本身更快地执行更多,然后尝试使用REDO
个参数:
REDO
参数增加LOG_BUFFER
缓冲区大小。请注意,UNDO
操作也会生成REDO
,因此无论如何都要这么做。
NOLOGGING
无用,因为它仅适用于here列出的某些操作集,DELETE
不属于这些操作之一。
答案 4 :(得分:0)
已删除的CLOB不会在UNDOTBS中结束,因为它们已在LOB段中进行版本控制和重新定位。我认为它会在撤消中产生一些LOBINDEX更改。
如果您之前为空或清空LOB,您是否实际测量了DELETE的提交时间?如果发出数千个删除,是否使用批量提交?实例是空闲的吗?然后AWR报告应该告诉你发生了什么。