![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Optimizer=CHOOSE
{bas} © (2002-11-28 15:35:00)Мастера, помогите разобратся со статистикой и индексами...
Есть для всех таблиц нужные индексы, собрал сатистику по всем таблицам как написано в доке (analyze table <table_name> compute statistics) и все равно этот оракул без хинтов не хочет понимать, что нужно юзать индексы...
Даже при таком легком запросе он делает FullScan двух таблиц:
SELECT * FROM t1, t2 where t1.id = t2.id and t1.fk = 10
на t1.id, t2.id и t1.fk есть индексы
ПОМОГИТЕ..........А то уже давано с этим борюсь, но все никак...
Sly (2002-11-28 19:06:00) [21]Похоже, действительно на проблему с распределением, а вот такой запросец, какой результат покажет?
SELECT m / c
FROM (SELECT MAX (cnt) m
FROM (SELECT t1.fk, COUNT (1) cnt
FROM t1
GROUP BY t1.fk)),
(SELECT COUNT (*) c
FROM t1)
{bas} (2002-11-28 18:53:00) [22]Кстати, я разработчик и по совместительству администратор.
{bas} (2002-11-28 18:52:00) [23]cardinality я не нашел в плане запроса(я работаю с TOAD, а там этого нет),
fk(у меня очень динамичный программный комплекс) =
5 - от 0 до 3
10 - всегда от 0 до 10
50 - %1
20 - все остальное
num_distinct_rows/num_rows = 1
null - вообще нет
petr_v_a (2002-11-28 18:23:00) [24]А зачем sort_area_size 32 мегабайта? :)
Давайте определимся - Вы разработчик или администратор( пусть вынужденный :)?
>неужели лучше сделать FTS...
Оптимайзер считает, что лучше. Предыдущие вопросы остаются в силе - правильно ли прикидываются cardinality, насколько равномерно распределено fk, и каково отношение num_distinct_rows/num_rows, сколько там null`ов
{bas} (2002-11-28 18:07:00) [25]И вообще, хочу сказать, что с этим "ХОРОШИМ" FTS у меня все жутко тормозит
{bas} (2002-11-28 17:58:00) [26]sort_area_size = 33554432
остальные по уолчанию...
На самом деле я делаю на много сложнее запросы, но и там Оракул не хочет использовать индексы даже если я выбираю ОПРЕДЕЛЕННЫЕ поля из таблиц
неужели лучше сделать FTS чем по индексу искать, кстати fk=10, всего несколько записей(к примеру)
petr_v_a (2002-11-28 17:08:00) [27]В плане запроса посмотрите, правильно ли оптимизатор прикидывает cardinality.
Если неправильно, либо плохая статистика, либо неравномерное распределение значений -> используйте гистограммы
Если правильно, значит, либо оптимизатов все делает правильно, либо почему-то Full Table Scan считает выгоднее ошибочно -> вопрос к админу ( db_multiblock_read_count, hash_area_size, sort_area_size, optimizer_index_cost_adj и т.д. и т.п )
Но по результатам исследования кофейной гущи :) можно предположить, что поле fk имеет очень мало различных значений относительно общего кол-ва записей, и FTS действительно выгоднее - Oracle умеет его делать очень хорошо
Sly (2002-11-28 16:45:00) [28]Стоимостный оптимизатор, по собранной статистике решает, что FULL TABLE SCAN (FTS), выгоднее чем (UNIQUE?) INDEX SCAN + TABLE ACCESS BY ROWID.
Причины могут быть следующие:
1. Плохое распределение данных, например t2.fk в 50% строк принимает значение 10, а 50% значение 20, тогда по операциям ввода вывода FTS может оказаться более выгодно (см. petr_v_a © (28.11.02 15:46))
2. (Может быть не применимо) Ты указал SELECT * и оптимизатор, решил что, раз уж все равно тащить все данные из таблиц, то дешевле сразу ее полностью просканировать. Следует учесть, что если указать в SELECT только колонки из таблиц, то он возьмет значения из индексов, не лазая в таблицу. Т.е лучше указать данные, которые действительно нужно получить.
Кстати, 20 тыс записей – это в одной таблице, а во второй?
{bas} (2002-11-28 16:21:00) [29]>>Sly © (28.11.02 16:09)
А как надо его использовать, если мне нужные данные из t2(по связи с t1), и что бы поле из t1 НАПРИМЕРравнялось 10?????
{bas} (2002-11-28 16:11:00) [30]>>А по каким хинтам он начинает индекс использовать?
по хинтам /*+ INDEX()*/
>>А таблицы большие?
около 20т. записей
>>может, FTS выгоднее, т.к. по чтениям помещается в db_multiblock_read_count ( или около этого :)
что такое FTS??
Кстати поставил Optimizer_Mode = RULE, он естественно поднял все индексы, но остается вопрос: Если надо выбрать из индексов какой юзать сначала у разных таблиц, то все равно нужна статистика???
Sly (2002-11-28 16:09:00) [31]А распределение данных t1.fk, t2.id хорошее?
Так ли надо использовать Select *?
petr_v_a (2002-11-28 15:46:00) [32]А по каким хинтам он начинает индекс использовать?
А таблицы большие? может, FTS выгоднее, т.к. по чтениям помещается в db_multiblock_read_count ( или около этого :)