Я читал эту книгу, в которой говорится, что
База данных предполагает, что Indexed_Col IS NOT NULL охватывает слишком большой диапазон, чтобы быть полезным, поэтому база данных не будет приводить к индексу из этого условия.
Я понимаю , что эта книга более чем 10 лет, но он уже доказал весьма полезным - Используя инструкции , почерпнутые из его страниц, я помчался запрос на коэффициент десять.
Далее в беге EXPLAIN ANALYZE
на SELECT
запрос, я обнаружил , что ни один из моих индексов не используют, даже тогда , когда все права, они должны быть.
Таким образом, мой вопрос:
Предположим, что есть таблица, в которой есть столбец, определение столбца которого содержит «NOT NULL», и существует индекс, который охватывает этот столбец. Будет ли этот индекс использоваться в запросе к этой таблице, где столбцы являются частью запроса?
Подобно:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
источник
WHERE column IS NOT NULL
может не использовать индекс, потому что, как говорится в книге: «охватывает слишком большой диапазон, чтобы быть полезным». Если 90% значений не являются нулевыми, seqscan, вероятно, тоже будет быстрее.NOT NULL
столбца дляIS NOT NULL
запроса, если этот индекс также не полезен для других частейWHERE
предложения, фильтров объединения и т. Д. Или не может использоваться для упорядоченного сканирования только по индексу. Другими словами, он будет полностью игнорировать избыточностьIS NOT NULL
вNOT NULL
столбце и будет делать выбор индекса, основываясь на других деталях. (См. Редактирование, повторное сканирование только по индексу).В дополнение к подробному ответу Крейга я хотел добавить, что на обложке книги, на которую вы ссылаетесь, написано:
Так что я бы не поверил, что он станет хорошим источником советов по PostgreSQL в частности. Каждая СУБД может быть на удивление разной!
Я немного озадачен вашим первоначальным вопросом, но вот пример, показывающий, что раздел книги не на 100% правильный. Чтобы избежать путаницы, вот весь соответствующий параграф, вы можете увидеть его в Поиске книг Google .
Postgres может на самом деле (в следующем надуманном случае) использовать индекс для удовлетворения
IS NOT NULL
запросов без добавления полей сканирования диапазона, как предложеноPositive_ID_Column > -1
. См. Комментарии на вопросы Крейга о том, почему Postgres выбирает этот индекс в данном конкретном случае, и примечание об использовании частичных индексов.Кстати, это Postgres 9.3, но я считаю, что результаты будут примерно одинаковыми на 9.1, хотя он не будет использовать «сканирование только по индексу».
Редактировать: я вижу, что вы прояснили свой первоначальный вопрос, и вы, вероятно, задаетесь вопросом, почему Postgres не использует индекс в простом примере, таком как:
Возможно, потому что у вас нет строк в таблице. Так что добавьте некоторые тестовые данные и
ANALYZE my_table;
.источник
NOT NULL
, а не то, что запрос использует вIS NOT NULL
качестве условия индекса. Это в комментариях, на которые вы ссылались, но я обновлю вопрос, чтобы включить его.Вы не разместили свой запрос или пример данных. Но наиболее распространенная причина, по которой индексы не используются, связана с объемом.
Индексы похожи на телефонную книгу, которая переводит столбец в местоположение строки. Если вы ищете только несколько строк, имеет смысл просмотреть каждую строку в телефонной книге, а затем посмотреть строку в основной таблице.
Но для нескольких строк дешевле пропустить телефонную книгу и выполнить итерации по всем строкам в основной таблице. По моему опыту переломный момент составляет около 100 строк.
источник
CREATE INDEX ix_frank ON people(name) WHERE name ='frank'
.NOT NULL