суббота, 3 апреля 2010 г.

Селективность индексов в SQLite

При разработке больших БД возникает необходимость в использовании множества индексов, но скорость вставки данных при этом падает катастрофически. Проанализировав, пришел к следующему результату - высокоселективный индекс на больших таблицах ведет себя ужасно. То есть, если в таблице 10М записей проиндексировать поле с десятком вариантов значений, это еще ничего, но если значений миллион, то скорость вставки записей снизится на несколько порядков.

Для небольших таблиц рекомендации известны:
Re: Behavior of SELECT queries during transaction

С большими наборами данных все интереснее - в случае единственного индекса потенциально хорошую производительность можно получить при вставке заранее упорядоченного набора записей. Если же индексов много, то даже предварительная подготовка добавляемых записей ничего не даст.

Расширение FTS3 предоставляет другую реализацию индекса - и этот индекс отлично работает с высокоселективными значениями. Зато имеет большие проблемы при выборок низкоселективных значений :-)
sqlite - FTS3 performance oddity

Замечу, что при упорядоченной вставке 1 миллиарда первичных ключей в таблицу скорость вставки снижается всего лишь примерно на 3% - великолепный результат. Но это верно только до тех пор, пока вставляемые записи строго упорядочены.

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru