代码之家  ›  专栏  ›  技术社区  ›  Vitalii Ponomar

PostgreSQL优化:顺序扫描VS索引扫描

  •  0
  • Vitalii Ponomar  · 技术社区  · 8 年前

    我有一个关于postgres表上select的有趣案例:

    advert (~2.5 million records)
        id serial,
        user_id integer (foreign key),
        ...
    

    这是我的选择:

    select count(*) from advert where user_id in USER_IDS_ARRAY
    

    如果 USER_IDS_ARRAY 长度<=100我接下来要解释分析:

    Aggregate  (cost=18063.36..18063.37 rows=1 width=0) (actual time=0.362..0.362 rows=1 loops=1)
      ->  Index Only Scan using ix__advert__user_id on advert  (cost=0.55..18048.53 rows=5932 width=0) (actual time=0.030..0.351 rows=213 loops=1)
            Index Cond: (user_id = ANY ('{(...)}'))
            Heap Fetches: 213
    Planning time: 0.457 ms
    Execution time: 0.392 ms
    

    但当 用户ID数组 长度>100:

    Aggregate  (cost=424012.09..424012.10 rows=1 width=0) (actual time=867.438..867.438 rows=1 loops=1)
      ->  Seq Scan on advert  (cost=0.00..423997.11 rows=5992 width=0) (actual time=0.375..867.345 rows=213 loops=1)
            Filter: (user_id = ANY ('{(...)}'))
            Rows Removed by Filter: 2201318
    Planning time: 0.261 ms
    Execution time: 867.462 ms
    

    无论user_ids_ARRAY中的user_id是什么,只有长度才重要。

    有人知道如何为超过100个user_id优化这个选择吗?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Jakub Kania    8 年前

    如果 SET enable_seqscan = OFF 仍然不强制索引扫描,这意味着索引扫描是不可能的。原来这里的指数是部分的。