Система предпочитает не использовать индекс - PullRequest
0 голосов
/ 13 мая 2019

У меня есть таблица отношений (друг, минуты), где минуты равномерно распределены в интервале [0; 500]. Рассмотрим запрос с условием B ≥ 250. Чтобы оптимизировать этот запрос, я создал некластеризованный индекс по минутам. Однако система предпочитает не использовать индекс. Почему?

Друг является первичным ключом

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

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

Использование индекса приводит к накладным расходам:

  • Страницы индекса необходимо считывать в память.
  • Связанные страницы данных также необходимо считывать в память.
  • К страницам данных не обращаются по порядку, что может привести к перебоям в условиях нехватки памяти (больших данных).

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

Что вы можете сделать?Один из вариантов - создать индекс, который охватывает вашего запроса.То есть вместо индексации (minutes), индекс (minutes, friend).Поскольку все столбцы находятся в индексе, доступ к страницам данных не требуется.

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

0 голосов
/ 13 мая 2019

Ваше условие запроса не является выборочным.Это касается половины записей.Оптимизатор запросов считает, что сканирование таблицы лучше для производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...