SQL Delete语句执行缓慢

时间:2014-11-25 05:56:55

标签: 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 |    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 - access("a"="a" AND "b"="b" AND "c"="c" AND 
              "d"="d")
   4 - filter("p_date">=TO_DATE(' 2014-11-17 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND 
              "p_date"<=TO_DATE(' 2208-01-22 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

1 个答案:

答案 0 :(得分:2)

Table2中是否有分区?同时使用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