Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 哪种类型的数据库索引有助于查询比较两个字段?_Postgresql - Fatal编程技术网

Postgresql 哪种类型的数据库索引有助于查询比较两个字段?

Postgresql 哪种类型的数据库索引有助于查询比较两个字段?,postgresql,Postgresql,给定一个有两个十进制字段x和y的表。 我想查询“x>=y”的记录。 我应该使用什么类型的索引来提高此类查询的性能?只有当条件是选择性的,即只有一小部分行满足条件时,索引才有用。否则,顺序扫描是找到匹配行的最便宜的方法 我可以想出两种方法来实现这一点: 重写查询并创建匹配的表达式索引: CREATE INDEX ON mytable ((x - y)); 在表上运行ANALYZE,以收集索引表达式的统计信息 然后像这样重写查询: EXPLAIN SELECT * FROM mytable WHE

给定一个有两个十进制字段x和y的表。 我想查询“x>=y”的记录。
我应该使用什么类型的索引来提高此类查询的性能?

只有当条件是选择性的,即只有一小部分行满足条件时,索引才有用。否则,顺序扫描是找到匹配行的最便宜的方法

我可以想出两种方法来实现这一点:

  • 重写查询并创建匹配的表达式索引:

    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
    ,并且该表没有太多修改,则可以进行仅索引扫描,而不必接触该表。缺点是指数变得更大。你必须检查什么对你最好

  • 我的测试表包含1000行,其中54行符合条件

    因此,第一种方法可能更好,因为估计值更好。
    部分索引扫描仅使用表大小的三分之一的哑估计值。

    “PostgreSQL提供了索引方法B-tree、hash、GiST、SP GiST、GIN和BRIN。用户也可以定义自己的索引方法,但这相当复杂。”(from)因此,您应该定义自己的索引方法,其他索引类型在这里似乎没有帮助。这不是一个非常有用的评论。。。