Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так... И что мне сделать... ??? / 12 сообщений из 12, страница 1 из 1
14.10.2002, 16:43
    #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
14.10.2002, 16:53
    #32058069
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
Мало информации. Приведите два плана и желательно с характеристиками объектов (кардинальность, колл. блоков данных на ключ для индекса, колл. блоков в таблице). И значение параметра optimizer_index_cost_adj.
...
Рейтинг: 0 / 0
14.10.2002, 16:56
    #32058071
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
а, еще попробуйте без скобок и напишите какая версия Оракла. В 8.1.7 в выражении типа sysdate-1 индекс всегда используется.
...
Рейтинг: 0 / 0
14.10.2002, 17:18
    #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
14.10.2002, 17:22
    #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
14.10.2002, 17:27
    #32058099
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
у вас PQO срабатывает.
Попробуйте хинт /*+ NOPARALLEL(events) */
...
Рейтинг: 0 / 0
14.10.2002, 17:33
    #32058106
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
гораздо интереснее понять почему PQO срабатывает? Похоже, что в первом случае sysdate неявно приводится к литералу, а во втором уже не может.
...
Рейтинг: 0 / 0
14.10.2002, 17:36
    #32058108
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
может там статистика просто не собрана?
...
Рейтинг: 0 / 0
14.10.2002, 17:42
    #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
14.10.2002, 17:57
    #32058124
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
Забудьте про cost. В этом нет ничего страшного, если запрос отрабатывает за меньшее время.
...
Рейтинг: 0 / 0
14.10.2002, 18:06
    #32058132
Konstantin_Barsukov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
Вопрос в следующем
Почему оптимизатор
sysdate
и sysdate - 1 обрабатывает по разному?
...
Рейтинг: 0 / 0
14.10.2002, 18:13
    #32058136
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так... И что мне сделать... ???
Потому что оптимизатор считает, что на шаге 3 (INDEX RANGE SCAN) будет возвращено 455 строк вместо 3х для первого варианта.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему так... И что мне сделать... ??? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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