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