2014-11-25 41 views
0

SQL查询下面的时间超过2分钟。请建议一些替代方案。SQL删除语句执行速度缓慢

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

我不知道为什么我不能编辑你的问题。要格式化代码或表格,您可以选择全部,然后按ctrl + k。请做。 – 2014-11-25 06:01:07

+3

*** SQL ***只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品......很多东西都是特定于供应商的 - 所以我们真的需要知道什么**数据库系统**(以及您使用的版本)(请相应地更新标签)...... – 2014-11-25 06:22:56

+0

虽然它可能不会加快速度:在外部条件不需要'和a = 1' ,因为你只会匹配'a = 1' - 因为你的子选择。 – evilive 2014-11-25 06:41:48

回答

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 
+0

是的,表2上有一个分区...您建议的查询需要47秒。 – Famy 2014-11-25 06:43:21

+0

快60%!不错。现在你能确保分区修剪发生在'Table2'上吗?什么是分区列?它是'p_date'吗?这是什么类型的分区?范围/列表? – hashbrown 2014-11-25 06:57:50

+0

对不起,我不知道分区修剪。 Table2上的分区列是a。它是列表类型的分区。 – Famy 2014-11-25 07:57:51