powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DELETE FROM TABLE1 T1 WHERE ID2 in (SELECT ID2 FROM TABLE2 BL WHERE T2_id = ?)
3 сообщений из 3, страница 1 из 1
DELETE FROM TABLE1 T1 WHERE ID2 in (SELECT ID2 FROM TABLE2 BL WHERE T2_id = ?)
    #40042501
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый,

Есть таблицы TABLE1 и TABLE2 (условно), TABLE2 небольшая таблица, по списку значений в которой
надо удалить строки из большой таблицы TABLE1:


Код: plsql
1.
2.
3.
 DELETE 
  FROM TABLE1  T1
  WHERE  ID2 in (SELECT ID2 FROM TABLE2 BL  WHERE T2_id = ?).  



Нормальный план выглядит так, т.е. выборка небольшого количества(100-5000) строк из TABLE2 и удаление по
ним из T1 :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
------------------------------------------------------------------------
| Id  | Operation          | Name              | Rows  | Bytes | Cost  |
------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |                   |     1 |    41 |     2 |
|   1 |  DELETE            | TABLE1            |       |       |       |
|   2 |   NESTED LOOPS     |                   |     1 |    41 |     2 |
|*  3 |    INDEX RANGE SCAN| TABLE2_PK         |     1 |    26 |     1 |
|*  4 |    INDEX RANGE SCAN| TABLE1_PK         |     1 |    15 |     1 |




И этот план я вижу сейчас, но в логах программы, идет такой план,
где всё вывернуто наизнанку, и запрос работает неэффективно и долго:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  -------------------------------------------------------------------------------------------
| Id  | Operation             | Name              | Rows  | Bytes | Cost  | Pstart| Pstop |
 -------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |                   |   157M|  4065M| 12244 |       |       |
|   1 |  DELETE               | TABLE1            |       |       |       |       |       |
|   2 |   NESTED LOOPS        |                   |   157M|  4065M| 12244 |       |       |
|   3 |    PARTITION RANGE ALL|                   |   412M|  5898M| 12243 |     1 |    84 |
|   4 |     INDEX FULL SCAN   | TABLE1_PK         |   412M|  5898M| 12243 |     1 |    84 |
|*  5 |   INDEX UNIQUE SCAN   | TABLE2_PK         |     1 |    12 |     1 |       |       |

-------------------------------------------------------------------------------------------



Можно принудительно получить правильный план с помощью хинтов:

Код: plsql
1.
2.
3.
DELETE /*+ LEADING(T2)  USE_NL(T2 T1) */   
  FROM ATB_HISTORY  T1
  WHERE ID2 in (SELECT ID2 FROM CPBAN_BAN_LIST T2  WHERE T2_id = ?). 



Но хотелось бы разобраться как такое возможно.
К сожалению у меня нет доступа к серверу(linux), с которого запускалась программа.
Информацию получил по предоставленным логам, анализируя производительность(жалобы на медленную работу).

Может ли быть такое, что на момент работы программы были одни настройки в Init.ora(OPTIMIZER_INDEX_CACHING....),
а сейчас поменяли, и поэтому не могу получить "плохой" план, или тут есть еще какие-то варианты?
Например влияние клиента Oracle и его настроек(sqlnet.ora, переменные среды, ...) , или нет такого?

В самой программе нет ALTER SESSION.... для изменения параметров CBO.
У меня доступ только к логам, а повторно программу будут запускать через несколько недель.
...
Рейтинг: 0 / 0
DELETE FROM TABLE1 T1 WHERE ID2 in (SELECT ID2 FROM TABLE2 BL WHERE T2_id = ?)
    #40042552
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
412M
...
Рейтинг: 0 / 0
DELETE FROM TABLE1 T1 WHERE ID2 in (SELECT ID2 FROM TABLE2 BL WHERE T2_id = ?)
    #40042624
Keklik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|
412M

ну о чем и речь, там удаляется строк 500, а бежать может под час по логам.
По нормальному плану это DELETE должен пролетать незаметно.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DELETE FROM TABLE1 T1 WHERE ID2 in (SELECT ID2 FROM TABLE2 BL WHERE T2_id = ?)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]