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'))
答案 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