2014-02-17 4 views
0

У меня есть эта таблица структуры:Postgres 9,3 индекс включая JSON столбец

CREATE TABLE user_items 
(
    user_id bigint references users(id) NOT NULL, 
    item_id bigint references items(id) NOT NULL, 
    col1 json DEFAULT '[{"text":""}]', 
    col2 json DEFAULT '[{"date":"","text":""}]', 
    col3 json DEFAULT '{"text":""}', 
    PRIMARY KEY (user_id, item_id) 
) 

я буду выполнение запросов, таких как это:

SELECT * FROM user_items WHERE item_id = '?' AND col1 IS NOT NULL 

мне нужен индекс (item_id, col1) в этом случае делать?

И если да, то каков правильный способ это сделать, потому что при попытке его Postgres выдает ошибку, так как col1 - это тип JSON.

ответ

1

Я предлагаю использовать partial index на item_id:

CREATE INDEX foo_idx ON user_items (item_id) 
WHERE col1 IS NOT NULL 

Тип данных col1 не имеет значения здесь , Обязательно включите аргумент verbatim WHERE в запросах, чтобы позволить Postgres использовать этот индекс.

+0

Спасибо за это. Я думал, что причина, по которой тип данных имеет значение, заключается в том, что я не могу просто сделать индекс (item_id, col1). Кажется, это имеет смысл, поскольку «col1» - это тип JSON. – haknick

+0

@haknick: Тип данных * будет * релевантным для индекса в столбце JSON. Я избежал проблемы, сделав это условие для частичного индекса. Тестирование для NULL работает для любого типа. –

0

Вам понадобится только это, если каждый item_id встречается много раз, а col1 обычно равен NULL. Если любой из них неверен, просто сделайте индекс на (item_id). База данных должна будет посетить строку и отфильтровать те, где col1 - NULL, но если NULL встречается редко, это не будет иметь большого значения.

Если NULL является общим, то попробуйте «функциональный» или «выражение» индекс (item_id, (col1 is not null))

Смежные вопросы