PostgreSQL:在同一索引上交叉索引扫描
PostgreSQL: intersect index scans on the same index
正在尝试解决这个问题:Sql: choose all baskets containing a set of particular items
也就是说有一个table:
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 高级索引技术,例如 位图索引?
通过在 SELECT
上执行标准 INTERSECT
,您可以有效地获得 "intersect index scan"(无论 有效 是什么):
SELECT basketId FROM tbl_basket_item WHERE itemId = 2
INTERSECT
SELECT basketId FROM tbl_basket_item WHERE itemId = 4;
正在尝试解决这个问题:Sql: choose all baskets containing a set of particular items
也就是说有一个table:
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 高级索引技术,例如 位图索引?
通过在 SELECT
上执行标准 INTERSECT
,您可以有效地获得 "intersect index scan"(无论 有效 是什么):
SELECT basketId FROM tbl_basket_item WHERE itemId = 2
INTERSECT
SELECT basketId FROM tbl_basket_item WHERE itemId = 4;