2015-11-18 4 views
0

Я искал для ответа на этот вопрос, но единственной ссылкой, которую я смог найти, была неясная публикация форума, в которой говорилось, что операторы, в том числе% (по модулю) , были " (т. е. может использовать индекс, над которым работал оператор).Может ли postgres использовать индекс, когда предложение является модулем

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

У кого-нибудь есть окончательный ответ или аналогичный опыт?

Postgres/EDB v9.3

ТИА.

Редактировать например.

CREATE TABLE my_table(id bigint, othercolumn varchar(50), PRIMARY KEY(id)) 

... вставить х миллионов записей в таблицу ...

SELECT othercolumn from my_table where id % 1000 = 0 
+1

Если вы создаете индекс с этим выражением, то да, Postgres будет использовать этот индекс, если он улучшит производительность. Но вам нужно добавить определение таблицы ('create table ...') и запрос к вашему вопросу, чтобы на это можно было ответить правильно. См. Здесь: http://stackoverflow.com/tags/postgresql-performance/info –

+0

Это очень общий вопрос. Я добавлю пример. – mrmoosehead

+0

Частичный индекс - это возможность, за исключением того, что мы хотим, чтобы модульная «параллелизация» настраивалась ... – mrmoosehead

ответ

0

Индексы могут быть использованы на любой столбец или выражение, которое неизменны. Другими словами, результат выражения должен зависеть только от значений базовых столбцов либо напрямую, либо через выражение, в котором они используются. Таким образом, оператор modulo вполне допустим для использования в индексе.