Одиночное сканирование индекса может использовать только те условия запроса, в которых задействованы столбцы индекса с операторами из его класса операторов и которые объединены оператором
AND. Например, если имеется индекс по (a, b)
условие запроса вида WHERE a = 5 AND b = 6 может
использовать индекс, но запрос вида WHERE a = 5 OR b = 6 не сможет
использовать индекс напрямую.
К счастью,
Digital Q.DataBase предусмотрена возможность объединения нескольких индексов
(включая многократное использование одного и того же индекса) для обработки случаев, которые не могут
быть реализованы с помощью одиночного сканирования индекса. Система может формировать 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 для идентификации результирующих строк.
Для совместного использования нескольких индексов система сканирует каждый необходимый индекс и формирует битовую карту в памяти, содержащую сведения о расположении строк таблицы, которые соответствуют условиям этого индекса. Затем битовые карты объединяются по логике AND или OR в зависимости от условий запроса. Наконец, система обращается к фактическим строкам таблицы и возвращает результат. Строки таблицы считываются в физическом порядке, так как именно таким образом выстроена битовая карта; это означает, что любая упорядоченность исходных индексов теряется, и в случае наличия в запросе ORDER
BY потребуется отдельный этап сортировки. По этой причине, а также из-за того, что каждое дополнительное сканирование индекса увеличивает время выполнения, планировщик запросов может выбрать простое сканирование индекса, даже если доступны другие индексы, которые также могли быть использованы.
Почти во всех приложениях, за исключением самых простых, существуют различные комбинации индексов, которые могут быть полезны, поэтому разработчик базы данных должен искать компромисс при принятии решения о том, какие именно индексы следует создать. В некоторых случаях оптимальным решением являются многостолбцовые индексы, однако иногда лучше создать отдельные индексы и использовать функционал их объединения. Например, если рабочая нагрузка включает в себя смесь запросов, в которых задействован только столбец
x, а иногда только столбец y, а иногда по обоим
столбцам, целесообразно создать два отдельных индекса для
x и y, полагаясь на объединение индексов для обработки запросов, использующих оба столбца. Вы также можете создать
многостолбцовый индекс для (x, y). Как правило, такой индекс более эффективен, чем объединение индексов для запросов по обоим столбцам, однако, как отмечается в Раздел 2.8.3, он
будет практически бесполезен для запросов, затрагивающих только y, поэтому он не должен быть единственным индексом. Сочетание многостолбцового индекса
и отдельного индекса для y будет работать достаточно эффективно. Для
запросов, затрагивающих только x, может использоваться многостолбцовый индекс, хотя он будет иметь больший размер и, как следствие, работать медленнее, чем индекс только для
x в отдельности. Последний вариант заключается в создании всех трех индексов, но это оправдано только в том случае, если чтение из таблицы выполняется значительно чаще, чем обновление данных, и все три типа запросов используются регулярно. Если один из типов запросов встречается гораздо реже остальных, вероятно, следует ограничиться созданием только двух индексов, наиболее подходящих для распространенных типов запросов.