我在 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
我有一张大桌子,里面entities
有大约 1500 万条记录。我想在他们的name
.
我在 上有一个全文索引name
,用于:gin_ix_entity_full_text_search_name
询问:
SELECT "entities".*,
ts_rank(to_tsvector('english', "entities"."name"::text),
to_tsquery('english', 'hockey'::text)) AS "rank0.48661998202865475"
FROM "entities"
WHERE "entities"."place" = 'f'
AND (to_tsvector('english', "entities"."name"::text) @@ to_tsquery('english', 'hockey'::text))
ORDER BY "rank0.48661998202865475" DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)
持续时间 25,623 毫秒
解释计划 1 限制(成本=12666.89..12666.89 行=5 宽度=3116) 2 -> 排序(成本=12666.89..12670.18 行=6571 宽度=3116) 3 排序键: (ts_rank(to_tsvector('english'::regconfig, (name)::text), '''hockey'''::tsquery)) 4 -> 实体上的位图堆扫描(成本 = 124.06..12645.06 行 = 6571 宽度 = 3116) 5 重新检查条件: (to_tsvector('english'::regconfig, (name)::text) @@'''hockey'''::tsquery) 6 过滤器:(不是地方) 7 -> gin_ix_entity_full_text_search_name 上的位图索引扫描(成本=0.00..123.74 行=6625 …
postgresql performance query full-text-search postgresql-performance