powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оптимизатор всегда прав?
15 сообщений из 15, страница 1 из 1
оптимизатор всегда прав?
    #32136928
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cтоимостный оптимизатор при выборке данных делает full table scan. И действительно, делать это выгодней, чем пользоваться индексом. Как заставить его все-таки пользовать индекс. Пусть это будет медленней, но мне так нужно. Хинты не помогают. Есть ли вообще шанс заставить его работать так, как хочу я.
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32136940
Блин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде подсказку RULE испоьзуй если очень надо оптимизатор по правилам использовать.
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32136945
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читай про optimizer_index_caching и optimizer_index_cost_adj в init.ora

например
optimizer_index_caching=95
optimizer_index_cost_adj=5

Хинты ЗАСТАВЛЯЮТ использовать индекс, если это вообще возможно. Или неправильно хинт пишешь, или запрос такой что индекс не используется в любом из рассматриваемых оптимизатором вариантов
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32136951
Александр Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос и "неработающие" варианты хинтов - в студию
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137009
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ora600:Эти параметры я уже поставил, 95 и 1 соответственно.Он даже в этом случае не хочет индекс использовать и правильно делает, потому что записей в таблице мало и выгодней делать full scan. Вопрос был, можно ли заставить его пользоваться индексом, даже если, он думает иначе?
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137017
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально запрос такой:
Код: plaintext
1.
2.
3.
SELECT  /*+ALL ROWS*/  *
FROM T0 
WHERE f1 =value1 AND f2=value2 ORDER BY f2

ind1 = (f1,f2) - неуникальный индекс.
Пытался делать с хинтом /*+FIRST_ROWS INDEX_ASC("t" "ind1")*/. Тоже TABLE ACCESS FULL.
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137021
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/*+ index(ind1 to)*/
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137024
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>/*+ index(ind1 to)*/

ну уж правильно будет вот так:
/*+ index(to ind1)*/

А индекс в запросе с хинтом не используется потому, что у вас эти поля не NOT NULL, или укажите в запросе:

Код: plaintext
1.
2.
3.
WHERE f1 =value1 
         AND f2=value2 
         AND f1 is not null
         AND f2 is not null
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137034
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все поля в этой таблице описаны при создании как not null.
Добавление is not null не помогло:(
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137035
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда вместо select * делаю select f1,f2 индекс используется.Как только к этому добавляю еще какое-нибудь поле-full table scan.
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137036
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно полные примеры - запрос, план с костом, результат (если говорите, что небольшой)?
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137054
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудеса!
Может вы в курсе такого дела?
Вобщем выполняю запрос:
Код: plaintext
1.
2.
3.
4.
SELECT  /*+INDEX(t ind1)*/  *
FROM t 
WHERE f1 ='AAAA' AND f2= 201  
ORDER BY f2;

Его план:
Код: plaintext
1.
2.
3.
SELECT STATEMENT Optimizer=CHOOSE (Cost= 1  Card= 1  Bytes= 126 )
  TABLE ACCESS (BY INDEX ROWID) OF T (Cost= 1  Card= 1  Bytes= 126 )
    INDEX (FULL SCAN) OF IND1 (NON-UNIQUE) (Cost= 26  Card= 1 )

А изначально я выполнял запрос вот такой c синонимом:
Код: plaintext
1.
2.
3.
4.
SELECT  /*+INDEX(t ind1)*/  *
FROM t y0
WHERE y0.f1 ='AAAA' AND y0.f2= 201  
ORDER BY f2;

И вот его план:
Код: plaintext
1.
2.
SELECT STATEMENT Optimizer=CHOOSE (Cost= 1  Card= 1  Bytes= 119 )
  TABLE ACCESS (FULL) OF T (Cost= 1  Card= 1  Bytes= 119 )

Надобно отказываться от синонимов? Но почему его это смущает?
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137055
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle8i Designing and Tuning for Performance
Release 2 (8.1.6)
Part Number A76992-01

Код: plaintext
1.
2.
You must specify the table to be accessed exactly as it appears in the statement. 
If the statement uses an alias for the table, then use the alias rather than the 
table name in the hint
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137056
Korobok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное!!!
...
Рейтинг: 0 / 0
оптимизатор всегда прав?
    #32137092
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем смысл обязательного использования индекса?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / оптимизатор всегда прав?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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