Postgresql 提高多列索引和排序的性能

Postgresql 提高多列索引和排序的性能,postgresql,indexing,query-performance,postgresql-performance,Postgresql,Indexing,Query Performance,Postgresql Performance,解释分析的输出: SELECT * FROM table1 WHERE (col1, col2) IN (($1, $2), ($3, $4)) ORDER BY col3 LIMIT 10; 但当我取消订单时: Limit (cost=59174.75..59174.77 rows=10 width=113) (actual time=3632.627..3632.661 rows=10 loops=1) -> Sort (cost=59174.75..59180.2

解释分析的输出

SELECT * FROM table1
WHERE (col1, col2) IN (($1, $2), ($3, $4))
ORDER  BY col3
LIMIT  10;
但当我取消订单时:

 Limit  (cost=59174.75..59174.77 rows=10 width=113) (actual time=3632.627..3632.661 rows=10 loops=1)
   ->  Sort  (cost=59174.75..59180.22 rows=2188 width=113) (actual time=3632.623..3632.634 rows=10 loops=1)
         Sort Key: col3
         Sort Method: top-N heapsort  Memory: 27kB
         ->  Nested Loop  (cost=2.62..59127.46 rows=2188 width=113) (actual time=0.234..3561.309 rows=38347 loops=1)
   ...........
   Total runtime: 3632.818 ms
  • (col1,col2)上有一个复合
    b树索引
    ,col3上有一个
    b树索引
  • 写入性能和存储不是优先级。读取性能至关重要,需要尽可能快
  • 这必须能够支持查询IN子句:
    WHERE(col1,col2)IN($1,$2),($3,$4))ORDER BY col3 LIMIT 10。(查找总是带有IN子句,然后是order。)

  • 注意:是否可以在(col1、col2、col3)上创建索引?这将使用
    (col1,col2)
    进行查找,并且已经订购了
    col3

    是。你已经得到了问题的答案。
    对于给定的查询,on
    (col1,col2,col3)
    应该是完美的。试试看

    有关dba.SE上此相关问题下的多列B树索引中列的顺序的更多信息:

    此外,如果您实际上不需要表1中的所有列,请仅将所需列放入
    选择列表中,而不是
    *
    ,以获得性能

    在里面 至于你的额外要求:

    SELECT * FROM table1 WHERE (col1, col2) IN (($1, $2), ($3, $4)) LIMIT 10;
     Limit  (cost=2.62..272.85 rows=10 width=105) (actual time=0.258..1.143 rows=10 loops=1)
       ->  Nested Loop  (cost=2.62..59127.46 rows=2188 width=105) (actual time=0.255..1.115 rows=10 loops=1)
    ........
    Total runtime: 1.306 ms
    
    相当于:

    WHERE (col1, col2) IN (($1, $2), ($3, $4))
    
    这降低了索引在
    (col1,col2,col3)
    上的有效性,因为Postgres不能仅仅从索引中获取预先排序的列表。视情况而定。
    列表中的
    项越少,并且每个
    (col1,col2)
    具有相同
    col3
    的行越多,您可以从所述索引中获得的收益就越多

    你得测试一下。另外创建索引,确保您的统计数据是最新的(),并且您的数据是合理的,然后
    EXPLAIN
    将显示Postgres选择的内容。确保运行一组表示用例的查询。最后,删除未使用的索引

    诱使博士后有效使用特殊索引 分类步骤似乎是昂贵的部分。尝试此替代查询:在
    列表中的
    中,每个项目有一个
    联合所有
    分支。这为Postgres提供了一个它无法拒绝的条件:特殊索引非常适合这个查询。最后的排序步骤对于
    项目中的少数
    项目来说是便宜的

    WHERE (col1 = $1 AND col2 = $2 OR
           col1 = $3 AND col2 = $4)
    

    请注意,除了最后的
    orderby
    LIMIT
    之外,每个分支都需要所有括号来允许
    orderby
    LIMIT
    ,我稍微修改了问题:
    这必须能够支持in子句的查询:WHERE(col1,col2)in($1,$2),($3,$4))col3订单限制10;。(查找总是带有IN子句,然后是order。)
    在这种情况下,多列索引方法仍然有效吗?@校友:我添加了一些内容来解决您的添加。我添加了索引,没有IN子句的查找速度非常快。然而,当我开始使用IN子句时,性能会显著下降。我还可以做些什么来提高性能?似乎目的是避免昂贵的
    排序
    步骤。当IN子句不起作用时,单次查找可以避免它t@alumns例如我可能有东西给你。检查添加的段落。
    
    (
    SELECT *
    FROM   table1
    WHERE  col1 = $1 AND col2 = $3
    ORDER  BY col3
    LIMIT  10
    )
    UNION  ALL
    (
    SELECT *
    FROM   table1
    WHERE  col1 = $3 AND col2 = $4
    ORDER  BY col3
    LIMIT  10
    )
    ... UNION  ALL ...
    ORDER  BY col3
    LIMIT  10