我有一个名为auto_reviewwhere column type is的数据库列boolean。该字段有一个索引,使用 ActiveRecord ORM 创建。
CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew);
Run Code Online (Sandbox Code Playgroud)
当我查询布尔值的字段时,PG 按预期使用索引。
EXPLAIN for: SELECT "table".* FROM "table" WHERE "table"."auto_renew" = 'f'
QUERY PLAN
----------------------------------------------------------------------------------------------
Bitmap Heap Scan on table (cost=51.65..826.50 rows=28039 width=186)
Filter: (NOT auto_renew)
-> Bitmap Index Scan on index_domains_on_auto_renew (cost=0.00..44.64 rows=2185 width=0)
Index Cond: (auto_renew = false)
(4 rows)
Run Code Online (Sandbox Code Playgroud)
当值为 时NULL,使用顺序扫描。
EXPLAIN for: SELECT "table".* FROM "table" WHERE "table"."auto_renew" IS NULL
QUERY PLAN
----------------------------------------------------------------
Seq Scan …Run Code Online (Sandbox Code Playgroud) 我们使用 Amazon RDS 实例
x86_64-pc-linux-gnu 上的 PostgreSQL 11.13,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位
我有一个简单的经典每组前 1 名查询。我需要获取每个 的历史记录中的最新项目creativeScheduleId。
这是表和索引的定义:
CREATE TABLE IF NOT EXISTS public.creative_schedule_status_histories (
id serial PRIMARY KEY,
"creativeScheduleId" text NOT NULL,
-- other columns
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_creativescheduleid_id
ON public.creative_schedule_status_histories ("creativeScheduleId" ASC, id ASC);
Run Code Online (Sandbox Code Playgroud)
当引擎的查询排序时id ASC仅读取索引并且不执行任何额外的排序:
EXPLAIN (ANALYZE)
SELECT history.id, history."creativeScheduleId"
FROM (
SELECT cssh.id, cssh."creativeScheduleId"
, ROW_NUMBER() OVER (PARTITION BY cssh."creativeScheduleId"
ORDER BY cssh.id ASC) …Run Code Online (Sandbox Code Playgroud) postgresql index execution-plan window-functions greatest-n-per-group