2015-09-07 4 views
0

Попытки решить эту проблему: Sql: choose all baskets containing a set of particular itemsPostgreSQL: пересекается индекс сканирует на тот же индекс

Других слов есть таблица:

tbl_basket_item 
--  
basketId itemId 

1 2 
1 3 
1 4 
2 3 
2 4 
3 2 
3 4 

ItemId индексируются.

Если я выполнить сканирование на Itemid = 2, я получаю:

SELECT basketId FROM tbl_basket_item WHERE itemId = 2 

1 
3 

Если я выполнить сканирование на Itemid = 4, я получаю:

SELECT basketId FROM tbl_basket_item WHERE itemId = 4 

1 
2 
3 

Могу ли я теперь пересекаются эти два сканирования, чтобы получить:

SELECT basketId FROM tbl_basket WHERE 
    basketId IN (SELECT basketId FROM tbl_basket_item WHERE itemId = 2) AND 
    basketId IN (SELECT basketId FROM tbl_basket_item WHERE itemId = 4) 

1 
3 

с использованием некоторых продвинутых технологий индексирования PostgeSQL, таких как растровые индексы?

+1

Что именно ваш вопрос? Вы ищете оператор 'interesct'? Я также не вижу, как конкретный индекс _type_ имеет отношение к вашему вопросу. У вас проблемы с производительностью с этим заявлением? Если да, то прочитайте это: https://wiki.postgresql.org/wiki/Slow_Query_Questions –

+0

Двойной запрос NOT EXISTS() генерирует сканирование индекса для внутреннего запроса в таблице соединений (даже для этого очень маленького rowcount = 7) – joop

+0

@joop Я попробую! –

ответ

1

Вы эффективно получить «пересекаться сканирование индекса» (что бы это ни эффективно есть), выполнив стандартный INTERSECT на ваш SELECT:

SELECT basketId FROM tbl_basket_item WHERE itemId = 2 
INTERSECT 
SELECT basketId FROM tbl_basket_item WHERE itemId = 4; 
+0

Вот что я искал! Что такое производительность? (Не было замечено никаких заметок об этом на официальной странице). –

+0

Работает как очарование: http://sqlfiddle.com/#!15/1885a/7 –