使用Oracle 10g中的CLOB字段从表中删除缓慢

时间:2009-02-08 00:38:29

标签: sql oracle plsql oracle10g clob

当我尝试从包含两个CLOB字段的表中删除行时,我遇到了Oracle非常慢的问题。该表具有数百万行,没有约束,删除基于主键。我重建了索引和重新计算的统计数据,但没有用。

如何提高此表中删除的效果?

5 个答案:

答案 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表空间,这需要几十秒钟。

你能做些什么呢?

  1. 创建更快的UNDO:将其放在单独的磁盘上,使其更少稀疏(创建更大的数据文件)。
  2. 使用ROLLBACK SEGMENTS代替托管UNDO,为此查询分配ROLLBACK SEGMENT,并在运行查询前发出SET TRANSACTION USE ROLLBACK SEGMENT
  3. 如果不是这样,我。即ROLLBACK比查询本身更快地执行更多,然后尝试使用REDO个参数:

    1. 使用REDO参数增加LOG_BUFFER缓冲区大小。
    2. 增加日志文件的大小。
    3. 在不同的磁盘上创建日志文件,以便从第一个数据文件中读取不会妨碍写入第二个文件等等。
    4. 请注意,UNDO操作也会生成REDO,因此无论如何都要这么做。

      之前提出的

      NOLOGGING无用,因为它仅适用于here列出的某些操作集,DELETE不属于这些操作之一。

答案 4 :(得分:0)

已删除的CLOB不会在UNDOTBS中结束,因为它们已在LOB段中进行版本控制和重新定位。我认为它会在撤消中产生一些LOBINDEX更改。

如果您之前为空或清空LOB,您是否实际测量了DELETE的提交时间?如果发出数千个删除,是否使用批量提交?实例是空闲的吗?然后AWR报告应该告诉你发生了什么。