具有时间刻度扩展的 Postgres 不在 DISTINCT 查询中使用跳过扫描

Postgres with timescale extension does not use skip scan in DISTINCT query

我希望我的查询使用跳过扫描并遵循此 post: https://www.timescale.com/blog/how-we-made-distinct-queries-up-to-8000x-faster-on-postgresql/

跳过扫描应该从时间刻度版本 2.2.1 开始可用。我正在使用 2.3.1.

为此,我生成了一个新索引,如 post (psr_type_tzc_timestampidx) 中所述

如果我运行这个查询

EXPLAIN ANALYSE SELECT DISTINCT ON (psr_type) psr_type, utc_timestamp
   FROM generation_per_type
   ORDER BY psr_type, utc_timestamp DESC

查询计划如下所示:

Unique  (cost=126.37..2781479.65 rows=20 width=12) (actual time=2114.861..21926.310 rows=20 loops=1)
  ->  Merge Append  (cost=126.37..2678236.07 rows=41297430 width=12) (actual time=2114.858..18887.986 rows=41297430 loops=1)
        Sort Key: _hyper_2_279_chunk.psr_type, _hyper_2_279_chunk.utc_timestamp DESC
        ->  Index Only Scan using _hyper_2_279_chunk_psr_type_ztc_timestampidx on _hyper_2_279_chunk  (cost=0.42..1651.47 rows=85650 width=12) (actual time=11.596..36.191 rows=85650 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_280_chunk_psr_type_ztc_timestampidx on _hyper_2_280_chunk  (cost=0.42..2881.85 rows=149635 width=12) (actual time=15.261..59.023 rows=149635 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_281_chunk_psr_type_ztc_timestampidx on _hyper_2_281_chunk  (cost=0.42..2889.45 rows=150069 width=12) (actual time=15.068..57.579 rows=150069 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_282_chunk_psr_type_ztc_timestampidx on _hyper_2_282_chunk  (cost=0.42..2891.31 rows=150119 width=12) (actual time=14.395..67.302 rows=150119 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_283_chunk_psr_type_ztc_timestampidx on _hyper_2_283_chunk  (cost=0.42..2891.56 rows=150136 width=12) (actual time=19.602..70.908 rows=150136 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_284_chunk_psr_type_ztc_timestampidx on _hyper_2_284_chunk  (cost=0.42..2888.48 rows=150004 width=12) (actual time=16.743..63.102 rows=150004 loops=1)
              Heap Fetches: 0
        ->  Index Only Scan using _hyper_2_285_chunk_psr_type_ztc_timestampidx on _hyper_2_285_chunk  (cost=0.42..2892.36 rows=150189 width=12) (actual time=15.833..62.003 rows=150189 loops=1)

没有迹象表明 Custom Scan (SkipScan) on _hyper_8_79_chunk。 此查询未使用跳过扫描的可能原因是什么?知道我可以尝试让它发挥作用吗?

有一个成本分析,如果唯一值的数量接近总行数,它可能会选择不使用 skipscan。

另一种可能是您使用的是 Apache 2.0 许可版本的 TimescaleDB,在这种情况下,skipscan 不可用。

如果这些因素都不适用,我想知道您是否可以得到一个可重现的案例作为一个问题与团队分享? 希望这可以帮助? 透明度:我为 Timescale 工作