postgresql - PostgreSQL 查询不使用索引
问题描述
表定义如下:
CREATE TABLE public.the_table
(
id integer NOT NULL DEFAULT nextval('the_table_id_seq'::regclass),
report_timestamp timestamp without time zone NOT NULL,
value_id integer NOT NULL,
text_value character varying(255),
numeric_value double precision,
bool_value boolean,
dt_value timestamp with time zone,
exported boolean NOT NULL DEFAULT false,
CONSTRAINT the_table_fkey_valdef FOREIGN KEY (value_id)
REFERENCES public.value_defs (value_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE RESTRICT
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.the_table
OWNER TO postgres;
指数:
CREATE INDEX the_table_idx_id ON public.the_table USING brin (id);
CREATE INDEX the_table_idx_timestamp ON public.the_table USING btree (report_timestamp);
CREATE INDEX the_table_idx_tsvid ON public.the_table USING brin (report_timestamp, value_id);
CREATE INDEX the_table_idx_valueid ON public.the_table USING btree (value_id);
查询是:
SELECT * FROM the_table r WHERE r.value_id = 1064 ORDER BY r.report_timestamp desc LIMIT 1;
在运行查询时 PostgreSQL 不使用the_table_idx_valueid
索引。
为什么?
解决方案
如果有的话,这个索引会有所帮助:
CREATE INDEX ON the_table (value_id, report_timestamp);
根据条件的选择性和表中的行数,PostgreSQL 可能正确推断出顺序扫描和排序比索引扫描快。
推荐阅读
- java - 在 Intellij 中运行 Spring Boot 应用程序时如何设置系统属性?
- airflow - DAG第一个任务要等到上一次DAG运行的所有任务都完成
- python - 如何使用 wget 读取基于 https 的数据?
- javascript - 如何转换成反应中的点击
- node.js - Express.js - req.session 变量在另一个控制器中未定义
- neo4j - Neo4j:如何在大而简单的事务中避免内存不足
- json - 当某些 json 类型的列具有某些空属性时,如何避免 PySpark from_json 在读取 csv 时返回整个空行
- java - 编译 Confluence 3.5.13 源 java 依赖项时出现 Maven 缺少依赖项错误
- wcf - WCF 服务器上的“有序”标志在可靠会话中的作用是什么?
- asp.net-core - 2 个具有不同 dbContexts 的应用程序用户