Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
ВнизВремя выполнения запроса Найти похожие ветки
← →
yaral © (2006-03-23 13:24) [0]У меня есть база с таблицей в которой порядка 250 млн записей, в ней поле типа varchar(5), в первом случае на него не построен индекс, и запрос вида:
SELECT * FROM BIGTABLE WHERE F1="XXXXX"
выполняется довольно быстро (500 млс), и фетчутся все записи потом тоже довольно быстро (4 c)
При построение индекса по этому полю время выполнения этого же запроса увеличивается примерно в 4 раза.
Но при выполнени этого запроса при WHERE F1="XXXXX" где "XXXXX" в таблице нету, запрос без индекса по этому полю начинает очень догло выполняться т.е. 20 мин.
А если с индексом то время не меняется, т.е. довольно быстро.
В таблице примерно 250 млн записей, разброс по полю "XXXXX" примерно 5000 вариантов
Скажите, почему так происходит?
← →
Sergey13 © (2006-03-23 13:27) [1]2 yaral © (23.03.06 13:24)
Не понял. Ты постоянно переиндексируешь таблицу что ли?
← →
yaral © (2006-03-23 13:29) [2]Нет у меня две базы, в одна с индексом, другая без
← →
Sergey13 © (2006-03-23 13:33) [3]2[2] yaral © (23.03.06 13:29)
И что? Ты экспериментирушь с индексами или это какая то практическая задача? Что удивительного в том, что с индексами читает быстрее? Они для того и предназначены.
Или я не въехал в вопрос?
← →
yaral © (2006-03-23 13:38) [4]В том то и дело что с индексами не быстрее, если такие записи есть то в 4 раза дольше! Но вот если нет записей подходящих под условие то запрос без индексов начинает очень долго выполняться! Почему?
← →
Johnmen © (2006-03-23 13:39) [5]Неплохо бы привести здесь планы запросов.
← →
Johnmen © (2006-03-23 13:39) [6]И описание построенного индекса...
← →
yaral © (2006-03-23 13:41) [7]Планы запросов в случае без индексов natural с индексом по индексу соответсвенно выполняеться
Индекс по полю одному полю varchar(5) построен, других нет
← →
Sergey13 © (2006-03-23 13:46) [8]2[4] yaral © (23.03.06 13:38)
>В том то и дело что с индексами не быстрее, если такие записи есть то в 4 раза дольше!
Ну так идет считывание и передача найденного? Ссылка найдена в индексе. Идет переход в таблицу и читается запись. Если не найдено, то перехода в таблицу нет.
>Но вот если нет записей подходящих под условие то запрос без индексов начинает очень долго выполняться! Почему?
Идет полное сканирование таблицы для подтверждения, что "нет записей подходящих под условие".
Что удивительного то?
Как-то структурируй свои результаты. А то вперемежку с/без индексов сбивают с толку.
← →
Johnmen © (2006-03-23 13:52) [9]Ну не хочешь приводить, да и ладно...
← →
yaral © (2006-03-23 13:55) [10]>> Sergey13 © (23.03.06 13:46) [8]
при имеющихся в таблице заначениях из условия where f1="XXXXX"
- Запрос без использования индексов 600 млс
- Запрос с использованием индексов 2400 млс
если в таблице нет заначений удовлетворяющих условию where f1="XXXXX"
- Запрос без использования индексов 20 мин !!!!!!
- Запрос с использованием индексов 2400 млс
← →
yaral © (2006-03-23 13:56) [11]> Johnmen © (23.03.06 13:52) [9]
Посмотреть не могу, сейчас на другой машине работаю, приведу обязательно!
← →
Sergey13 © (2006-03-23 14:01) [12]2[10] yaral © (23.03.06 13:55)
>при имеющихся в таблице заначениях из условия where f1="XXXXX"
- Запрос без использования индексов 600 млс
- Запрос с использованием индексов 2400 млс
Тебе тут просто повезло. Записи нашлись в "начале" сканируемой таблицы и пошел их вывод. Попробуй сразу перейти на последнюю запись, и скорее всего будут те-же 20 минут.
>если в таблице нет заначений удовлетворяющих условию where f1="XXXXX"
- Запрос без использования индексов 20 мин !!!!!!
- Запрос с использованием индексов 2400 млс
См.выше. Тут тебе не повезло. 8-)
← →
yaral © (2006-03-23 14:07) [13]>> Sergey13 © (23.03.06 14:01) [12]
Я на разных "XXXXX" проверял, и которые в начале, и в середине и в конце
Все тоже самое
← →
Sergey13 © (2006-03-23 14:15) [14]2[13] yaral © (23.03.06 14:07)
>Я на разных "XXXXX" проверял, и которые в начале, и в середине и в конце
Я специально в "начале" откавычил. Начало и конец таблицы - это фикция, и ты этого знать не можешь - где лежит запись - в начале или в конце.
В любом случае - попробу нажать кнопку перемещения в конец полученного набора данных сразу после того как запрос "отработал". Что будет?
← →
Anatoly Podgoretsky © (2006-03-23 14:23) [15]yaral © (23.03.06 14:07) [13]
О каких в начале, и в середине и в конце идет речь, откуда такое может взяться?
← →
yaral © (2006-03-23 14:50) [16]>> Anatoly Podgoretsky © (23.03.06 14:23) [15]
Просто вариантов не так много и можно из все проверить, какие из них должны быть в начале, а какие то в конце.
>> Sergey13 © (23.03.06 14:15) [14]
Конечно пробовал, в обоих случаях перемещается в конец НД с одинаковой скоростью, примерно 4 с.
← →
Sergey13 © (2006-03-23 14:58) [17]2 [16] yaral © (23.03.06 14:50)
Попробуй обновить индекс.
Хотя я не понял, чем тебе не нравится результат работы с индексами (он по твоим результатам уж всяко не хуже безиндексного). Из 250 лимонов записей выбрать 50000 за 600/2400 млс - очень неплохой показатель. Да еще и индекс по варчару.
← →
unknown © (2006-03-23 15:27) [18]К стати, а какова статистика индекса?
← →
ANB © (2006-03-23 17:37) [19]
> - Запрос без использования индексов 600 млс
А часом таблица не отсортирована по
этому полю ?
← →
Sergey Masloff (2006-03-23 18:05) [20]Нескромный вопрос - а Primary Key есть в таблице? ;-))))
Просто 20 минут наводит на мысли
← →
Desdechado © (2006-03-23 20:37) [21]много зависит от:
- кардинальности индекса (количества различных значений) - чем больше, тем лучше
- размера страницы в БД (от него зависит глубина бинарного дерева индекса, ибо глубина>3 плохо, почти как без индекса)
- размера кластера на диске с БД (желательно равенство с размером страницы или 2 кластера на страницу)
- допустимости NULL в поле
- если поле длиной 5 всегда имеет 5 знаков, то VARCHAR только ухудшает время доступа
- суммарной длины полей в записи (чем больше, тем хуже - даже при индексном поиске)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c