sql - 在Oracle中Delete语句非常慢

标签 sql oracle

我有一个约有10万条记录的表,我想删除一些行,问题是DELETE语句运行非常缓慢-它在30分钟内未完成。但是select语句在1秒内返回。SELECT语句如下:

select * from daily_au_by_service_summary 
    where summary_ts >= to_date('09-04-2012','dd-mm-yyyy') 
    order by summary_ts desc;
DELETE语句如下:
delete from daily_au_by_service_summary 
    where summary_ts > to_date('09-04-2012','dd-mm-yyyy');
该表的唯一索引位于summary_ts
可能是什么原因?
编辑:我杀死了锁定表的 session 后,问题已经解决,谢谢大家的帮助。
SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   OBJECT OWNER                   OBJECT_NAME                                                                                                                      OBJECT_TYPE         LOCKED_MODE
---------- ------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------- -----------
       213 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       203 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       202 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       190 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       189 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       188 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       187 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY         

最佳答案

原因可能有很多:

  • 服务器负载(不太可能因为SELECT快速)
  • 触发器(请参见how to list them for a table)。
  • 外键(List of foreign keys and the tables they reference)
  • 每行中有很多数据(LOB,很多列)。
  • 有人在您要删除的表(或整个表)中锁定了行。 See this blog post how to list locksThis discussion可能也有帮助。

  • 如果外键是问题,通常的解决方案是在外列上添加索引:对于每个删除操作,Oracle需要检查这是否违反外键关系。

    关于sql - 在Oracle中Delete语句非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10101484/

    相关文章:

    mysql - 将日期作为字符串存储在 mysql 中是否安全?

    mysql - SQL:计算两个值之间出现的次数

    Python + cx_Oracle : Unable to acquire Oracle environment handle

    multithreading - 在 Oracle PL/SQL 中等待提交的作业完成?

    sql - 跨数据库链接在 oracle 中调用存储函数(返回用户定义类型的数组)

    sql - 如何进行一对一的左外连接?

    mysql - 根据第二个表中的链接文本字段搜索表

    mysql - 服务器更改后 SQL 查询变慢

    sql - 当一个范围具有一系列开始日期时比较两个日期范围

    oracle - 根据列值创建多列约束