Реализация
Методы построения индекса GiST
Самый простой способ построить индекс GiST - просто вставить в него все записи по одной. Для больших индексов это, как правило, медленно, поскольку если кортежи индекса разбросаны по всему индексу и индекс достаточно велик, чтобы не поместиться в кэш, потребуется много случайных операций ввода-вывода. PostgreSQL поддерживает два альтернативных метода начального построения индекса GiST: сортированный и буферизованный режимы.
Метод sorted
доступен только в том случае, если каждый из используемых индексом операторов классов предоставляет функцию sortsupport
, как описано в разделе «Расширяемость». Если это так, то этот метод обычно является наилучшим, поэтому он используется по умолчанию.
Буферизованный метод работает за счет того, что кортежи не вставляются сразу в индекс. Это может значительно сократить объем случайного ввода-вывода, необходимого для неупорядоченных наборов данных. Для хорошо упорядоченных наборов данных преимущество меньше или вообще отсутствует, потому что только небольшое количество страниц получает новые кортежи одновременно, и эти страницы помещаются в кэш, даже если индекс в целом этого не делает.
Буферизованный метод должен вызывать штрафную функцию чаще, чем простой метод, что потребляет дополнительные ресурсы процессора. Кроме того, буферам требуется временное дисковое пространство, вплоть до размера результирующего индекса. Буферизация также может влиять на качество результирующего индекса, как в положительную, так и в отрицательную сторону. Это влияние зависит от различных факторов, таких как распределение входных данных и реализация операторного класса.
Если сортировка невозможна, то по умолчанию при построении индекса GiST происходит переключение на метод буферизации, когда размер индекса достигает размера effective_cache_size
. Буферизацию можно вручную заставить или запретить с помощью параметра buffering
в команде CREATE INDEX
. Поведение по умолчанию подходит для большинства случаев, но отключение буферизации может несколько ускорить сборку, если входные данные упорядочены.