SQL Delete语句执行缓慢

SQL Delete语句执行缓慢,sql,oracle,database-performance,Sql,Oracle,Database Performance,下面的SQL查询需要2分钟以上的时间。请提出一些替代方案 DELETE from Table1 WHERE (a, b, c, d) IN (SELECT a, b, c, d FROM Table2 WHERE a = 1 AND p_date BETWEEN '17-NOV-2014' AND '22-JAN-2208') AND a = 1 简单地解释一下: | 3 | PARTIT

下面的SQL查询需要2分钟以上的时间。请提出一些替代方案

DELETE from Table1
WHERE (a, b, c, d) IN (SELECT a, b, c, d
                       FROM Table2
                       WHERE a = 1 AND p_date BETWEEN '17-NOV-2014' AND '22-JAN-2208')
  AND a = 1
简单地解释一下

|   3 |    PARTITION LIST SINGLE |              |  2232K|    76M|       |  2273   (2)| 00:00:28 |     1 |     1 |
|*  4 |     TABLE ACCESS FULL    | Table2       |  2232K|    76M|       |  2273   (2)| 00:00:28 |     1 |     1 |
|   5 |   PARTITION RANGE ALL    |              |   283M|    28G|       |   328K  (2)| 01:07:20 |     1 |   104 |
|   6 |    PARTITION LIST SINGLE |              |   283M|    28G|       |   328K  (2)| 01:07:20 |KEY(AP)|KEY(AP)|
|   7 |     TABLE ACCESS FULL    | Table1       |   283M|    28G|       |   328K  (2)| 01:07:20 |   KEY |   KEY |
谓词信息(由操作id标识):

1-访问(“a”=“a”和“b”=“b”和“c”=“c”和
“d”=“d”)
4-过滤器(“p_date”>=截止日期('2014-11-17 00:00:00','syyyy mm dd hh24:mi:ss'),以及

“p_date”在
表2中是否有分区?同时将
in
子句中的
更改为
EXISTS
可能会使查询在Oracle中运行得更快…尝试一下,看看是否有任何区别-

DELETE from Table1 x
    WHERE EXISTS 
        (SELECT 1
             FROM Table2 y
            WHERE y.b = x.b AND y.c = x.c AND y.d = x.d AND y.p_date BETWEEN '17-NOV-2014' AND '22-JAN-2208' AND y.a=1)
       AND x.a = 1

我想知道为什么我不能编辑您的问题。要设置代码或表格的格式,您可以选择“全部”,然后按ctrl+k。请这样做。SQL只是一种结构化查询语言—许多数据库系统都使用这种语言,但不是一种数据库产品……许多东西都是特定于供应商的—因此我们确实需要知道什么数据库系统(以及哪个版本)您正在使用(请相应地更新标记)…尽管它可能不会加快速度:您不需要外部where条件中的
和a=1
,因为您的子选择只会匹配
a=1
-条目。根据(部分)添加了
oracle
标记执行计划。您的解释计划不完整,因此很难解释数字。
283M
328K
数字是否与实际行相对?是的,表2上有一个分区…您建议的查询需要47秒。60%的速度!不错。现在您可以确保分区修剪在
表2
上进行吗?什么是分区列吗?它是
p_date
?这是什么类型的分区?范围/列表?抱歉,我不知道分区修剪。表2上的分区列是a。它是分区的列表类型。如果它是列
a
上的列表分区,并且我们也使用谓词
a=1
,那么我猜数据库是智能enou如果需要,gh将执行分区修剪(即分区选择)…我真的看不到任何改进的可能性-但我的知识非常有限:)非常感谢您的帮助:)
DELETE from Table1 x
    WHERE EXISTS 
        (SELECT 1
             FROM Table2 y
            WHERE y.b = x.b AND y.c = x.c AND y.d = x.d AND y.p_date BETWEEN '17-NOV-2014' AND '22-JAN-2208' AND y.a=1)
       AND x.a = 1