Когда Manticore выполняет запрос полного сканирования, он может либо использовать простой скан для проверки каждого документа по фильтрам, либо применять дополнительные данные и/или алгоритмы для ускорения выполнения запроса. Manticore использует оптимизатор на основе стоимости (CBO), также известный как «оптимизатор запросов», чтобы определить, какой подход выбрать.
CBO также может улучшить производительность полнотекстовых запросов. Подробнее см. ниже.
CBO может решить заменить один или несколько фильтров запроса одним из следующих элементов, если он определит, что это улучшит производительность:
- docid индекс использует специальный вторичный индекс только по docid, хранящийся в файлах с расширением
.spt. Помимо улучшения фильтров по идентификаторам документов, docid индекс также используется для ускорения поиска соответствия docid к rowid и для ускорения применения больших списков исключений (killlists) при запуске демона. - Колоннарное сканирование опирается на колоннарное хранение и может использоваться только для колоннарного атрибута. Оно сканирует каждое значение и проверяет его по фильтру, но при этом сильно оптимизировано и обычно быстрее стандартного подхода.
- Вторичные индексы создаются по умолчанию для всех атрибутов (кроме JSON). Они используют PGM индекс вместе с встроенным инвертированным индексом Manticore для получения списка rowid, соответствующих значению или диапазону значений. Вторичные индексы хранятся в файлах с расширениями
.spidxи.spjidx. Для информации о том, как создавать вторичные индексы по JSON-атрибутам, см. json_secondary_indexes.
Оптимизатор оценивает стоимость каждого пути выполнения, используя различные статистики атрибутов, включая:
- Информацию о распределении данных внутри атрибута (гистограммы, хранящиеся в файлах
.sphi). Гистограммы генерируются автоматически при индексировании данных и служат основным источником информации для CBO. - Информацию из PGM (вторичные индексы), которая помогает оценить количество списков документов для чтения. Это помогает оценить производительность слияния doclist и выбрать подходящий алгоритм слияния (слияние с приоритетной очередью или слияние битмапов).
- Статистику колоннарного кодирования, используемую для оценки производительности декомпрессии колоннарных данных.
- Колоннарное дерево min-max. В то время как CBO использует гистограммы для оценки количества документов, оставшихся после применения фильтра, ему также нужно определить, сколько документов фильтр должен был обработать. Для колоннарных атрибутов частичная оценка дерева min-max служит этой цели.
- Полнотекстовый словарь. CBO использует статистику терминов для оценки стоимости вычисления полнотекстового дерева.
Оптимизатор вычисляет стоимость выполнения для каждого фильтра, используемого в запросе. Поскольку некоторые фильтры могут быть заменены несколькими разными элементами (например, для идентификатора документа Manticore может использовать простой скан, поиск по docid индексу, колоннарное сканирование (если docid колоннарный) и вторичный индекс), оптимизатор оценивает все доступные комбинации. Однако существует максимальный предел в 1024 комбинации.
Для оценки стоимости выполнения запроса оптимизатор рассчитывает предполагаемые затраты на наиболее значимые операции, выполняемые при выполнении запроса. Он использует предустановленные константы для представления стоимости каждой операции.
Оптимизатор сравнивает стоимости каждого пути выполнения и выбирает путь с наименьшей стоимостью для выполнения запроса.
При работе с полнотекстовыми запросами, которые имеют фильтры по атрибутам, оптимизатор запроса выбирает между двумя возможными путями выполнения. Один — выполнить полнотекстовый запрос, получить совпадения и применить фильтры. Другой — заменить фильтры одним или несколькими описанными выше элементами, получить rowid из них и внедрить их в полнотекстовое дерево поиска. Таким образом, результаты полнотекстового поиска пересекутся с результатами полного сканирования. Оптимизатор запроса оценивает стоимость вычисления полнотекстового дерева и лучший возможный путь для вычисления результатов фильтра. Используя эту информацию, оптимизатор выбирает путь выполнения.
Еще одним фактором является многопоточное выполнение запроса (когда включен pseudo_sharding). CBO учитывает, что некоторые запросы могут выполняться в нескольких потоках, и принимает это во внимание. CBO отдает приоритет более короткому времени выполнения запроса (то есть задержке), а не пропускной способности. Например, если запрос с использованием колоннарного сканирования может выполняться в нескольких потоках (и занимать несколько ядер CPU) и при этом быстрее, чем запрос, выполняемый в одном потоке с использованием вторичных индексов, будет предпочтено многопоточное выполнение.
Запросы с использованием вторичных индексов и docid индексов всегда выполняются в одном потоке, так как бенчмарки показывают, что многопоточное выполнение для них малоэффективно.
В настоящее время оптимизатор учитывает только затраты CPU и не принимает во внимание использование памяти или диска.