соединение таблиц

andrewi
Дата: 04.10.2004 20:43:42
Прошу помощи и местного населения.

пишу запрос:
select a.id from a, b where a.id=b.id and a.id=354;
все отлично использует индексы.

переписываю с Join
select id from a join b using (id) where id=354;
и нифига - table access full b, хочется конечно, что бы индексы использовал.

id это primary key.

подскажите, что делаю не так?!
igor2222
Дата: 05.10.2004 11:54:33
1. Собрана ли стаистика?
2. Какие именно индексы (примари кей в обоих таблицах только по ID или ID второй- это ФК)?
Варианты подключения: 1) через хинт 2) через шаблоны 3) попробовать добавить a.id=354 and b.id=354 (опять таки не знаю что у Вас за индексы)
Я и ёжик
Дата: 05.10.2004 12:14:19
Скорее всего для первого запроса используется оптимизатор по правилам ( Rule Based Optimizator ), который индексы использует везде где не попадя.

RBO не развивается с Oracle 7, а синтаксис c Join введен в Oracle 9i,
соответственно при использовании запроса с Join вместо RBO в работу включается стоимостной оптимизатор ( Cost Bsed Optimizer, CBO ).

CBO строит некоторые вероятностные предположения кассающиеся количество строк возвращаемых на разных шагах выполнения запроса и вероятного объема ввода/вывода опираясь на СТАТИСТИКУ собранную по объектам участвующим в запросе. Если статистики по объекту нет используются некоторые значения по умолчанию, которые могут сильно несоответствовать реальным.

Соответственно смотрите п.1 по igor2222.
+ если все еще будет плохо попробуйте почитать здесь и ссылки данные в этом топике.