嗨,我们正在 Amazon RDS 中运行一个 PostgreSQL 9.6 数据库,使用 m4.large(2cpu 8gb) 和 1000 的预置 IOPS。用例如下:我们有一个包含数百万个注册表(或多或少 4M)的表和我们创建了一个物化视图,其中包含该表的一个子集 (2M aprox),更改了一些列类型以提高查询效率。我们的 pg_conf 没有改变,是 RDS Postgres 的默认设置。
这是我们的视图定义:
CREATE MATERIALIZED VIEW public.customers_mv as
SELECT
id,
gender,
contact_info,
location,
social,
categories,
(social ->> 'follower_count')::integer AS social_follower_count,
(social ->> 'following_count')::integer AS social_following_count,
(social ->> 'peemv')::float AS social_emv,
(social ->> 'engagement')::float AS social_engagement,
(social ->> 'v')::boolean AS social_validated,
search_vector,
flags,
to_tsvector('english',concat_ws(' ','aal0_'||(customers.location ->> 'aal0'),
'aal1_'||(customers.location ->> 'aal1'),
'aal2_'||(customers.location ->> 'aal2'),
'frequent_location_aal0_'||(customers.location -> 'frequent_location' ->> 'aal0'),
'frequent_location_aal1_'||(customers.location -> 'frequent_location' ->> …
Run Code Online (Sandbox Code Playgroud) 语境:
PostgreSQL 10,users表有3667438条记录,users表有一个名为social的JSONB,我们通常使用对计算函数输出进行索引的策略,这样我们就可以将信息聚合到一个单独的索引中。的输出engagement(social)
函数是双精度数字类型。
问题:
有问题的条款是 ORDER BY engagement(social) DESC NULLS LAST
,还有一个 btree 索引idx_in_social_engagement with DESC NULLS LAST
附加到这个数据。
快速查询:
EXPLAIN ANALYZE
SELECT "users".* FROM "users"
WHERE (follower_count(social) < 500000)
AND (engagement(social) > 0.03)
AND (engagement(social) < 0.25)
AND (peemv(social) < 533)
ORDER BY "users"."created_at" ASC
LIMIT 12 OFFSET 0;
Limit (cost=0.43..52.25 rows=12 width=1333) (actual time=0.113..1.625
rows=12 loops=1)
-> Index Scan using created_at_idx on users (cost=0.43..7027711.55 rows=1627352 width=1333) (actual time=0.112..1.623 rows=12 loops=1)
Filter: ((follower_count(social) < 500000) AND …
Run Code Online (Sandbox Code Playgroud) postgresql performance order-by postgresql-10 postgresql-performance
我正在尝试将一个包含 50M 记录的表转储到一个文件中,我的目标是减少执行此操作的时间。我通常使用COPY metrics TO 'metrics.csv' DELIMITER ',' CSV;
在最好的情况下这可能需要一个小时。我也有兴趣以某种普通格式导出数据(避免使用pd_dump
目录)。
其中一个想法是通过条件或游标以某种方式访问此表,该条件或游标将整个表拆分为相同大小的部分,因此您可以同时执行例如 2 个复制查询,从而将时间减少一半。
例子:
COPY (SELECT * FROM metrics WHERE id < 25000000) TO 'metrics_1.csv' DELIMITER ',' CSV;
COPY (SELECT * FROM metrics WHERE id >= 25000000) TO 'metrics_2.csv' DELIMITER ',' CSV;
Run Code Online (Sandbox Code Playgroud)
在这些条件下创建的部分索引有帮助吗?
有什么想法是实现表的这种部分复制转储的好方法吗?有没有其他解决方案可以更快地转储此表?
Postgresql 11 / 100GB RAM / 20 核。
在与COPY
IO 边界进行一些并行化之后,这似乎不是瓶颈。
具有以下表结构
CREATE TABLE favorite_comments(
id SERIAL PRIMARY KEY NOT NULL,
opinion_id BIGINT REFERENCES opinions(id),
review_id BIGINT REFERENCES reviews(id),
list_id INTEGER REFERENCES lists(id) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
这是有效记录(与同一列表相关的评论和意见):
id, opinion_id, review_id, list_id
-------------------------------------
1, 333, NULL, 4
2, NULL, 444, 4
Run Code Online (Sandbox Code Playgroud)
但我想防止相同的评论或意见可能出现两次与同一个列表相关:
id, opinion_id, review_id, list_id
-------------------------------------
1, 333, NULL, 4
2, NULL, 444, 4
3, NULL, 444, 4 <- WRONG
Run Code Online (Sandbox Code Playgroud)
我想添加一个检查条件唯一性的约束UNIQUE(opinion_id, list_id) OR UNIQUE(review_id, list_id)
,但是因为opinion_id
,review_id
可以是 NULL 我对此有一些麻烦
我试过这个但不起作用
ALTER TABLE favorite_comments
ADD CONSTRAINT comments_can_only_be_saved_once_per_list
UNIQUE …