powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так... И что мне сделать... ???
12 сообщений из 12, страница 1 из 1
Почему так... И что мне сделать... ???
    #32058062
Konstantin_Barsukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выполняю следующее:

select * from events where event_time > sysdate
Выполняется за 0,05 sec
Стоимость 4

А если так :
select * from events where event_time > (sysdate -1)
тогда за 0,50
стоимость 17
Eplain plan сообщил что индекс не срабатывает
и происходит FULL TABLE ACCESS
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058069
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало информации. Приведите два плана и желательно с характеристиками объектов (кардинальность, колл. блоков данных на ключ для индекса, колл. блоков в таблице). И значение параметра optimizer_index_cost_adj.
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058071
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, еще попробуйте без скобок и напишите какая версия Оракла. В 8.1.7 в выражении типа sysdate-1 индекс всегда используется.
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058090
Konstantin_Barsukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1)select * from events where event_time > sysdate

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=3 Bytes=216)
1 0 PARTITION RANGE (ITERATOR)
2 1 TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'EVENTS' (Cost=4
Card=3 Bytes=216)

3 2 INDEX (RANGE SCAN) OF 'IDX_EVENTS_' (NON-UNIQUE) (Cost
=2 Card=3)

2)select * from events where event_time > (sysdate - 1)


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=455 Bytes=32
760)

1 0 PARTITION RANGE* (ITERATOR) :Q381200
0

2 1 TABLE ACCESS* (FULL) OF 'EVENTS' (Cost=16 Card=455 Bytes :Q381200
=32760) 0



1 PARALLEL_COMBINED_WITH_PARENT
2 PARALLEL_TO_SERIAL SELECT /*+ NO_EXPAND ROWID(A1) */ A1."EVENT_
ID",A1."LEAG_ID",A1."USER_ID",A1."ET

Пожалуйста, подскажите что делать?
Зарание благадорю.
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058092
Konstantin_Barsukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oracle 9.0.2
Я пробовал и со скобками и без них
Я пробовал и во так
event_time > (select to_date('13102002 16:17','DDMMYYYY HH24:MI') from dual)
или так
event_time > to_date('13102002 16:17','DDMMYYYY HH24:MI')
Не помогает
Всё равно индекс не сробатывает

Только так event_time > sysdate
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058099
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас PQO срабатывает.
Попробуйте хинт /*+ NOPARALLEL(events) */
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058106
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гораздо интереснее понять почему PQO срабатывает? Похоже, что в первом случае sysdate неявно приводится к литералу, а во втором уже не может.
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058108
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может там статистика просто не собрана?
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058112
Konstantin_Barsukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select /*+ NOPARALLEL(events) */* from events where event_time > (sysdate - 1)

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=32 Card=455 Bytes=32
760)

1 0 PARTITION RANGE (ITERATOR)
2 1 TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'EVENTS' (Cost=32
Card=455 Bytes=32760)

3 2 INDEX (RANGE SCAN) OF 'IDX_EVENTS_' (NON-UNIQUE) (Cost
=2 Card=455)
Ну вот проблема теперь вот какая :
1) ( > sysdate) Индексы срабатывает
Cost 4
2) ( > sysdate - 1) Индексы не срабатывает
cost 16
3) select /*+ NOPARALLEL(events) */* from events where event_time > (sysdate - 1) Индексы срабатывает
НО Cost 32
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058124
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забудьте про cost. В этом нет ничего страшного, если запрос отрабатывает за меньшее время.
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058132
Konstantin_Barsukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос в следующем
Почему оптимизатор
sysdate
и sysdate - 1 обрабатывает по разному?
...
Рейтинг: 0 / 0
Почему так... И что мне сделать... ???
    #32058136
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что оптимизатор считает, что на шаге 3 (INDEX RANGE SCAN) будет возвращено 455 строк вместо 3х для первого варианта.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так... И что мне сделать... ???
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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