想象一个视图,其中包含来自两个不同表的COALESCE
两varchar
列。
底层证券varchars
在两个表中都有索引。
在 Postgres 11.6 中,根据结果过滤此视图COALESCE
不使用索引,而是进行表扫描。
但是,如果我将列更改为text
,在同一列上过滤完全相同的视图,则索引将按您的预期使用。
假设我有一个一些标识符随时间变化的测量值表。还有一个几乎相同的表,其中包含估计值:
CREATE TABLE measured (
id int,
ts timestamp,
identifier character varying,
measured_value int
);
CREATE INDEX ON measured(identifier);
CREATE TABLE estimated (
id int,
ts timestamp,
identifier character varying,
estimated_value int
);
CREATE INDEX ON estimated(identifier);
Run Code Online (Sandbox Code Playgroud)
每个表有 100 万行数据:
INSERT INTO measured
SELECT
generate_series(1, 1000000),
to_timestamp((random() * 100000)::int),
left(md5(random()::text), 2),
random() * 10;
INSERT INTO estimated
SELECT
generate_series(1, 1000000),
to_timestamp((random() * …
Run Code Online (Sandbox Code Playgroud) postgresql varchar execution-plan index-tuning postgresql-performance
我有一个表,utc timestamptz
其中的列上有一个“btree”索引utc
:
CREATE TABLE foo(utc timestamptz)
CREATE INDEX ix_foo_utc ON foo (utc);
Run Code Online (Sandbox Code Playgroud)
该表包含大约5亿行数据。
当我utc
使用 进行过滤时BETWEEN
,查询规划器按预期使用索引:
> EXPLAIN ANALYZE
SELECT
utc
FROM foo
WHERE
utc BETWEEN '2020-12-01' AND '2031-02-15'
;
QUERY PLAN
Bitmap Heap Scan on foo (cost=3048368.34..11836322.22 rows=143671392 width=8) (actual time=12447.905..165576.664 rows=150225530 loops=1)
Recheck Cond: ((utc >= '2020-12-01 00:00:00+00'::timestamp with time zone) AND (utc <= '2031-02-15 00:00:00+00'::timestamp with time zone))
Rows Removed by Index Recheck: 543231
Heap Blocks: exact=43537 lossy=1818365
-> Bitmap …
Run Code Online (Sandbox Code Playgroud)