假设我有一个包含字段A和的表B。我在A+上进行常规查询B,所以我在 上创建了一个复合索引(A,B)。A复合索引是否也会对查询进行全面优化?
此外,我在 上创建了一个索引A,但 Postgres 仍然只使用复合索引来查询A。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A索引可用?
我有几个关于在 PostgreSQL 中使用索引的问题。我有一个Friends带有以下索引的表:
Friends ( user_id1 ,user_id2)
Run Code Online (Sandbox Code Playgroud)
user_id1并且user_id2是user表的外键
这些是等价的吗?如果不是,那为什么?
Index(user_id1,user_id2) and Index(user_id2,user_id1)
Run Code Online (Sandbox Code Playgroud)如果我创建主键(user_id1,user_id2),它会自动为它创建索引吗?
如果第一个问题中的索引不相等,那么在上面的主键命令上创建了哪个索引?
我有items以下架构的表(在 postgres v9.3.5 中):
Column | Type | Modifiers | Storage
-----------+--------+----------------------------------------------------+----------
id | bigint | not null default nextval('items_id_seq'::regclass) | plain
data | text | not null | extended
object_id | bigint | not null | plain
Indexes:
"items_pkey" PRIMARY KEY, btree (id)
"items_object_id_idx" btree (object_id)
Has OIDs: no
Run Code Online (Sandbox Code Playgroud)
当我执行查询时,它会挂起很长时间:
SELECT * FROM "items" WHERE "object_id" = '123' ORDER BY "id" DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
在 VACUUM ANALYZE 之后,查询执行改进了很多,但仍然不完美。
# EXPLAIN ANALYZE SELECT * FROM "items" WHERE "object_id" …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Postgres 9.4 中的大型(1.2TB)静态表创建部分索引。
我的数据是完全静态的,所以我可以插入所有数据,然后创建所有索引。
在这个 1.2TB 的表中,我有一个名为的列run_id,可以清晰地划分数据。通过创建涵盖一系列run_ids 的索引,我们获得了出色的性能。下面是一个例子:
CREATE INDEX perception_run_frame_idx_run_266_thru_270
ON run.perception
(run_id, frame)
WHERE run_id >= 266 AND run_id <= 270;
Run Code Online (Sandbox Code Playgroud)
这些部分索引为我们提供了所需的查询速度。不幸的是,每个部分索引的创建大约需要 70 分钟。
看起来我们的 CPU 有限(top进程显示为 100%)。
我可以做些什么来加快部分索引的创建?
系统规格:
表规格:
表定义:
CREATE TABLE run.perception(
id bigint NOT NULL,
run_id bigint NOT NULL,
frame bigint NOT NULL,
by character varying(45) NOT NULL,
by_anyone bigint NOT …Run Code Online (Sandbox Code Playgroud) postgresql performance index ddl performance-tuning postgresql-performance