时间:2021-07-01 10:21:17 帮助过:8人阅读
order_source,
3 SUM(commodity_num) num,
4 SUM(actual_charge) charge
5 FROM (
6 SELECT to_char(oc.create_date, ‘yyyyMMdd‘) AS order_date,
7 (CASE
8 WHEN oo.event_type = ‘ONLINE_COMMODITY_ORDER‘ THEN
9 ‘线上‘
10 ELSE
11 ‘线下‘
12 END) order_source,
13 oc.commodity_num,
14 oc.actual_charge actual_charge
15 FROM ord.ord_commodity_hb_2017 AS oc, ord.ord_order_hb_2017 AS oo
16 WHERE oc.order_id = oo.order_id
17 AND oc.op_type = 3 -- 3个值 ,3->5000 大概1/20的数据
18 AND oc.create_date BETWEEN ‘2017-02-05‘ AND ‘2017-12-07‘ -- 无用
19 AND oc.corp_org_id = 106 -- 无用
20 AND oo.trade_state = 11 -- 3个值 11 --> 71万行,一半数据
21 AND oo.event_type IN (values(‘ONLINE_COMMODITY_ORDER‘),
22 (‘USER_CANCEL‘),
23 (‘USER_COMMODITY_UPDATE‘)) -- 大概1/10 数据
24 ORDER BY oc.create_date -- 如果业务不强制,最好去掉排序,如果不能去掉,最好等过滤数据量到尽量小时再排序
25 ) T
26GROUP BY order_date, order_source;
SELECT relname, relkind, reltuples, relpages
FROM pg_class
WHERE relname LIKE ‘tenk1%‘;
relname | relkind | reltuples | relpages
----------------------+---------+-----------+----------
tenk1 | r | 10000 | 358
tenk1_hundred | i | 10000 | 30
tenk1_thous_tenthous | i | 10000 | 30
tenk1_unique1 | i | 10000 | 30
tenk1_unique2 | i | 10000 | 30
(5 rows)
12 1SELECT relname, relkind, reltuples, relpages
2FROM pg_class
3WHERE relname LIKE ‘tenk1%‘;
4
5 relname | relkind | reltuples | relpages
6----------------------+---------+-----------+----------
7 tenk1 | r | 10000 | 358
8 tenk1_hundred | i | 10000 | 30
9 tenk1_thous_tenthous | i | 10000 | 30
10 tenk1_unique1 | i | 10000 | 30
11 tenk1_unique2 | i | 10000 | 30
12(5 rows)
其中 relkind是类型,r是自身表,i是索引index;reltuples是项目数;relpages是所占硬盘的块数。名字 | 类型 | 描述 |
---|---|---|
relpages | int4 | 以页(大小为BLCKSZ)的此表在磁盘上的形式的大小。 它只是规划器用的一个近似值,是由VACUUM,ANALYZE 和几个 DDL 命令,比如CREATE INDEX更新。 |
reltuples | float4 | 表中行的数目。只是规划器使用的一个估计值,由VACUUM,ANALYZE 和几个 DDL 命令,比如CREATE INDEX更新。 |
选项 | 默认值 | 说明 | 是否优化 | 原因 |
max_connections | 100 | 允许客户端连接的最大数目 | 否 | 因为在测试的过程中,100个连接已经足够 |
fsync | on | 强制把数据同步更新到磁盘 | 是 | 因为系统的IO压力很大,为了更好的测试其他配置的影响,把改参数改为off |
shared_buffers | 24MB | 决定有多少内存可以被PostgreSQL用于缓存数据(推荐内存的1/4) | 是 | 在IO压力很大的情况下,提高该值可以减少IO |
work_mem | 1MB | 使内部排序和一些复杂的查询都在这个buffer中完成 | 是 | 有助提高排序等操作的速度,并且减低IO |
effective_cache_size | 128MB | 优化器假设一个查询可以用的最大内存,和shared_buffers无关(推荐内存的1/2) | 是 | 设置稍大,优化器更倾向使用索引扫描而不是顺序扫描 |
maintenance_work_mem | 16MB | 这里定义的内存只是被VACUUM等耗费资源较多的命令调用时使用 | 是 | 把该值调大,能加快命令的执行 |
wal_buffer | 768kB | 日志缓存区的大小 | 是 | 可以降低IO,如果遇上比较多的并发短事务,应该和commit_delay一起用 |
checkpoint_segments | 3 | 设置wal log的最大数量数(一个log的大小为16M) | 是 | 默认的48M的缓存是一个严重的瓶颈,基本上都要设置为10以上 |
checkpoint_completion_target | 0.5 | 表示checkpoint的完成时间要在两个checkpoint间隔时间的N%内完成 | 是 | 能降低平均写入的开销 |
commit_delay | 0 | 事务提交后,日志写到wal log上到wal_buffer写入到磁盘的时间间隔。需要配合commit_sibling | 是 | 能够一次写入多个事务,减少IO,提高性能 |
commit_siblings | 5 | 设置触发commit_delay的并发事务数,根据并发事务多少来配置 | 是 | 减少IO,提高性能 |
autovacuum_naptime | 1min | 下一次vacuum任务的时间 | 是 | 提高这个间隔时间,使他不是太频繁 |
autovacuum_analyze_threshold | 50 | 与autovacuum_analyze_scale_factor配合使用,来决定是否analyze | 是 | 使analyze的频率符合实际 |
autovacuum_analyze_scale_factor | 0.1 | 当update,insert,delete的tuples数量超过autovacuum_analyze_scale_factor*table_size+autovacuum_analyze_threshold时,进行analyze。 | 是 | 使analyze的频率符合实际 |
postgresql 性能优化
标签:避免 table 穷举 图片 launch cursor 客户 star rda