2014-11-25 3 views
0

Ниже SQL-запроса занимает более 2 минут. Пожалуйста, предложите альтернативу.Оператор SQL Delete медленное выполнение

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 

Объяснить Plain:

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

предиката Информация (идентифицированной операции ид):

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. Пожалуйста, сделайте это. –

+3

*** SQL *** - это только * Structured Query Language * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знать, что такое ** база данных system ** (и какую версию) вы используете (пожалуйста, обновите теги соответственно) .... –

+0

Хотя это, возможно, не ускорит его: вам не нужно «и a = 1» во внешнем условии , потому что вы будете соответствовать только символам 'a = 1' - из-за вашего подвыборки. – evilive

ответ

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

+0

60% быстрее! Неплохо. Теперь вы можете убедиться, что разделение разделов происходит на 'Table2'? Что такое секционированный столбец? Это 'p_date'? Какой тип раздела это? Range/Список? – hashbrown

+0

Извините, я не знаю обрезки разделов. Сегментированный столбец таблицы 2 является. И это тип списка в разделе. – Famy

Смежные вопросы