相关疑难解决方法(0)

日期索引优化

我在 PostgreSQL 9.0.8 中有一个很大的对象表(15M+ 行),我想查询过时的字段。

出于可扩展性和并发性的目的,我想将查询除以数百万,并且我想获取具有几天前日期的 updated_at 字段的所有数据。

我已经在 100 万个 ID 上尝试了许多索引和查询,但使用 Heroku 的 Ronin 硬件似乎无法在 100 秒内获得性能。

我正在寻找我尚未尝试使其尽可能高效的建议。

尝试 #1

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001;
 INDEX USED: (date(updated_at),id)
 268578.934 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #2

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE ((date(now()) - (date(updated_at)) > 7)) AND id >= 5000001 AND id < 6000001;
 INDEX USED: primary key
 335555.144 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #3

 EXPLAIN ANALYZE SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index partitioning postgresql-performance

32
推荐指数
1
解决办法
5万
查看次数

在 Postgres 列上创建唯一约束是否不需要对其进行索引?

在 Postgres 列上创建唯一约束是否不需要对其进行索引?

我希望自动需要一个索引来有效地维护约束。

postgresql index database-design unique-constraint

13
推荐指数
1
解决办法
4618
查看次数

优化 Postgres 中 20M 行的“最新”查询

我的表如下所示:

    Column             |    Type           |    
-----------------------+-------------------+
 id                    | integer           | 
 source_id             | integer           | 
 timestamp             | integer           | 
 observation_timestamp | integer           | 
 value                 | double precision  | 
Run Code Online (Sandbox Code Playgroud)

索引存在于 source_id、timestamp 以及时间戳和 id ( CREATE INDEX timeseries_id_timestamp_combo_idx ON timeseries (id, timeseries DESC NULLS LAST))的组合上

其中有 20M 行(好吧,有 120M,但是 20M,source_id = 1)。它有许多相同的条目,timestamp带有不同的observation_timestamp,它们描述了value发生在timestamp报告或观察到的事件observation_timestamp。例如,预测明天下午 2 点的温度与今天上午 12 点预测的一样。

理想情况下,该表可以很好地完成以下几件事:

  • 批量插入新条目,有时一次 100K
  • 选择观察到的时间范围数据(“1 月至 3 月的温度预测是多少”)
  • 选择从某个点观察到的时间范围观察到的数据(“我们在 11 月 1 日想到的对 1 月至 3 月的温度预测有何看法”) …

postgresql performance architecture

11
推荐指数
1
解决办法
549
查看次数

加速创建 Postgres 部分索引

我正在尝试为 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%)。
我可以做些什么来加快部分索引的创建?

系统规格:

  • 18核至强
  • 192GB 内存
  • RAID 中的 12 个 SSD
  • 自动吸尘器关闭
  • 维护工作内存:64GB(太高?)

表规格:

  • 大小:1.26 TB
  • 行数:105.37亿
  • 典型的索引大小:3.2GB(有 ~.5GB 的差异)

表定义:

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

8
推荐指数
1
解决办法
3546
查看次数