11.5. Сочетание нескольких индексов#

11.5. Сочетание нескольких индексов

11.5. Сочетание нескольких индексов

Одно сканирование индекса может использовать только предложения запроса, которые используют столбцы индекса с операторами его класса операторов и объединены с помощью AND. Например, при наличии индекса на (a, b), условие запроса вроде WHERE a = 5 AND b = 6 может использовать индекс, но запрос вроде WHERE a = 5 OR b = 6 не может напрямую использовать индекс.

К счастью, Tantor SE имеет возможность объединять несколько индексов (включая несколько использований одного и того же индекса) для обработки случаев, которые нельзя реализовать с помощью одиночного сканирования индекса. Система может формировать условия AND и OR через несколько сканирований индекса. Например, запрос вида WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 может быть разбит на четыре отдельных сканирования индекса на x, каждое сканирование использует одну из предложений запроса. Результаты этих сканирований затем объединяются с помощью операции OR для получения результата. Еще один пример - если у нас есть отдельные индексы на x и y, одна из возможных реализаций запроса вида WHERE x = 5 AND y = 6 - использовать каждый индекс с соответствующим предложением запроса, а затем объединить результаты индексов с помощью операции AND для определения строк результата.

Для объединения нескольких индексов система сканирует каждый необходимый индекс и создает в памяти битовую карту, указывающую на местоположение строк таблицы, которые соответствуют условиям этого индекса. Битовые карты затем объединяются с помощью операций И и ИЛИ в соответствии с требованиями запроса. Наконец, посещаются и возвращаются фактические строки таблицы. Строки таблицы посещаются в физическом порядке, так как именно так организована битовая карта. Это означает, что любой порядок исходных индексов теряется, и поэтому, если запрос содержит предложение ORDER BY, потребуется отдельный шаг сортировки. По этой причине, а также потому что каждое дополнительное сканирование индекса добавляет дополнительное время, планировщик иногда выбирает использовать простое сканирование индекса, даже если доступны дополнительные индексы, которые также могли бы быть использованы.

Во всех, кроме самых простых приложений, существуют различные комбинации индексов, которые могут быть полезны, и разработчику базы данных необходимо сделать компромисс, чтобы решить, какие индексы предоставить. Иногда лучше использовать многоколоночные индексы, но иногда лучше создать отдельные индексы и полагаться на возможность комбинирования индексов. Например, если ваша рабочая нагрузка включает смешанные запросы, которые иногда затрагивают только столбец x, иногда только столбец y, а иногда оба столбца, вы можете выбрать создание двух отдельных индексов на x и y, полагаясь на комбинирование индексов для обработки запросов, использующих оба столбца. Вы также можете создать многоколоночный индекс на (x, y). Этот индекс обычно будет более эффективным, чем комбинирование индексов для запросов, затрагивающих оба столбца, но, как описано в разделе Раздел 11.3, он будет почти бесполезен для запросов, затрагивающих только y, поэтому он не должен быть единственным индексом. Комбинация многоколоночного индекса и отдельного индекса на y будет работать достаточно хорошо. Для запросов, затрагивающих только x, можно использовать многоколоночный индекс, хотя он будет больше и, следовательно, медленнее, чем индекс только на x. Последней альтернативой является создание всех трех индексов, но это, вероятно, разумно только в случае, если таблица ищется намного чаще, чем обновляется, и все три типа запросов являются обычными. Если один из типов запросов гораздо менее распространен, чем другие, вероятно, вы остановитесь на создании только двух индексов, которые лучше всего соответствуют общим типам.