相关疑难解决方法(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万
查看次数

对值为 NULL 的布尔值进行查询时出现意外的 Seq 扫描

我有一个名为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)

postgresql index postgresql-8.3 postgresql-9.1

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