Postgresql 哪种类型的数据库索引有助于查询比较两个字段?
给定一个有两个十进制字段x和y的表。 我想查询“x>=y”的记录。Postgresql 哪种类型的数据库索引有助于查询比较两个字段?,postgresql,Postgresql,给定一个有两个十进制字段x和y的表。 我想查询“x>=y”的记录。 我应该使用什么类型的索引来提高此类查询的性能?只有当条件是选择性的,即只有一小部分行满足条件时,索引才有用。否则,顺序扫描是找到匹配行的最便宜的方法 我可以想出两种方法来实现这一点: 重写查询并创建匹配的表达式索引: CREATE INDEX ON mytable ((x - y)); 在表上运行ANALYZE,以收集索引表达式的统计信息 然后像这样重写查询: EXPLAIN SELECT * FROM mytable WHE
我应该使用什么类型的索引来提高此类查询的性能?只有当条件是选择性的,即只有一小部分行满足条件时,索引才有用。否则,顺序扫描是找到匹配行的最便宜的方法 我可以想出两种方法来实现这一点:
CREATE INDEX ON mytable ((x - y));
在表上运行ANALYZE
,以收集索引表达式的统计信息
然后像这样重写查询:
EXPLAIN SELECT * FROM mytable WHERE x - y >= 0;
QUERY PLAN
--------------------------------------------------------------------------------
Bitmap Heap Scan on mytable (cost=4.70..12.53 rows=55 width=20)
Recheck Cond: ((x - y) >= '0'::double precision)
-> Bitmap Index Scan on mytable_expr_idx (cost=0.00..4.69 rows=55 width=0)
Index Cond: ((x - y) >= '0'::double precision)
(4 rows)
CREATE INDEX ON mytable((bool 'TRUE')) WHERE x >= y;
再次分析表以获取统计信息
此索引可用于原始查询:
EXPLAIN SELECT * FROM mytable WHERE x >= y;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using mytable_bool_idx on mytable (cost=0.14..17.74 rows=333 width=20)
(1 row)
如果对所选列编制索引,而不是(小)伪值TRUE
,并且该表没有太多修改,则可以进行仅索引扫描,而不必接触该表。缺点是指数变得更大。你必须检查什么对你最好
部分索引扫描仅使用表大小的三分之一的哑估计值。“PostgreSQL提供了索引方法B-tree、hash、GiST、SP GiST、GIN和BRIN。用户也可以定义自己的索引方法,但这相当复杂。”(from)因此,您应该定义自己的索引方法,其他索引类型在这里似乎没有帮助。这不是一个非常有用的评论。。。