powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему FORALL DELETE FROM может не использовать индекс?
9 сообщений из 9, страница 1 из 1
Почему FORALL DELETE FROM может не использовать индекс?
    #39834115
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему FORALL DELETE FROM может не использовать индекс?

Есть таблица с индексом по ID

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE REG_RT.ELA_DOC_CHUNKS
(
  ID      NUMBER,
  CHUNK#  NUMBER
)
NOLOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;


CREATE BITMAP INDEX REG_RT.I_ELA_DOC_CHUNKS_BITMAP ON REG_RT.ELA_DOC_CHUNKS
(CHUNK#)
NOLOGGING
NOPARALLEL;


CREATE INDEX REG_RT.I_ELA_DOC_CHUNKS_ID ON REG_RT.ELA_DOC_CHUNKS
(ID)
NOLOGGING
NOPARALLEL;



На таблицу собрана статистика

Код: plsql
1.
2.
3.
4.
begin
dbms_stats.gather_table_stats(ownname => 'REG_RT', tabname => 'ELA_DOC_CHUNKS', cascade => true);
end;
/




В коде пакета есть удаление

Код: plsql
1.
2.
FORALL i IN 1..l_data.COUNT
         DELETE FROM ela_doc_chunks WHERE ID in l_data(i).elado_document_id;



Это удаление пораждает запрос

Код: plsql
1.
2.
DELETE FROM ELA_DOC_CHUNKS
      WHERE ID IN :B1



У запроса вот такой план, где видно что идет FULL SCAN и никакой индекс не используется.

Код: sql
1.
2.
3.
4.
Plan
DELETE STATEMENT  ALL_ROWSCost: 2  		
	2 DELETE REG_RT.ELA_DOC_CHUNKS 	
		1 TABLE ACCESS FULL TABLE REG_RT.ELA_DOC_CHUNKS Cost: 2  Bytes: 26  Cardinality: 1  



Вся процедура висит из-за этого.
Как заставить использовать индекс? Или почему он может не использоваться?
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834138
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сколько строк-то в таблице?
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834145
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex-lsсколько строк-то в таблице?Судя по cost=2 около нуля.
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834148
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob
Код: plsql
1.
ID IN :B1

Кого пытаешься запутать? - Себя? Oracle?
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834149
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Судя по cost=2 около нуля.
да я сам понимаю, просто хотел намекнуть автору
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834152
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-alex-lsсколько строк-то в таблице?Судя по cost=2 около нуля.

Всего 150 000 000 строк
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834153
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicMinistrBob
Код: plsql
1.
ID IN :B1

Кого пытаешься запутать? - Себя? Oracle?

Спасибо за намёк. Я как раз пытаюсь распутать, код не я писал :)
Заменил IN на = и все взлетело.
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834165
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MistrBlob, а на access/filter predicates можно глянуть? Мой оптимизитор, как и ожидалось, сам преобразует такой предикат в условие равенства.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select *
from dual
where dummy in ('X');

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("DUMMY"='X')
...
Рейтинг: 0 / 0
Почему FORALL DELETE FROM может не использовать индекс?
    #39834504
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadMistrBlob, а на access/filter predicates можно глянуть? Мой оптимизитор, как и ожидалось, сам преобразует такой предикат в условие равенства.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select *
from dual
where dummy in ('X');

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("DUMMY"='X')



План хороший, для такого запроса, но реальный запрос такого плана не имеет. Да ладно, уже руками поправил. Самое интересное это Windows 11.2.0.4, а до этого процедура работала на AIX 11.2.0.4 там всё было хорошо.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Plan hash value: 272002086
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("DUMMY"='X')
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему FORALL DELETE FROM может не использовать индекс?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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