转载:PostgreSQL SQL的性能提升
原文:http://blog.csdn.net/hantiannan/article/details/4522172
| PostgreSQL提供了一些帮助提升性能的功能。主要有一些几个方面。 |
| 1.使用EXPLAIN |
| EXPLAIN命令可以查看执行计划,在前面的blog中已经介绍过。这个方法是我们最主要的调试工具。 |
| 2.及时更新执行计划中使用的统计信息 |
| 由于统计 信息不是每次操作数据 库 都 进 行更新的,一般是在 VACUUM 、 ANALYZE 、 CREATEINDEX等DDL执行的时候会更新统计信息, |
| 因此执 行 计 划所用的 统计 信息很有可能比 较 旧。 这样执 行 计 划的分析 结 果可能 误 差会 变 大。 |
| 以下是表tenk1的相关的一部分统计信息。 |
| SELECT relname,relkind, reltuples, relpages |
| FROMpg_class |
| WHERE relnameLIKE '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) |
| 其中relkind是类型,r是自身表,i是索引index;reltuples是项目数;relpages是所占硬盘的块数。 |
| 3.明确用join来关联表 |
| 一般写法:SELECT * FROM a, b, cWHERE a.id = b.id AND b.ref = c.id; |
| 如果明确用join的话,执行时候执行计划相对容易控制一些。 |
| 例子: |
| SELECT * FROM a CROSS JOIN bCROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; |
| SELECT * FROM a JOIN (b JOINc ON (b.ref = c.id)) ON (a.id = b.id); |
| 4.关闭自动提交(autocommit=false) |
| 5.多次插入数据是用copy命令更有效率 |
| 我们有的处理中要对同一张表执行很多次insert操作。这个时候我们用copy命令更有效率。因为insert一次,其相关的index都要做一次,比较花费时间。 |
| 6.临时删除index |
| 有时候我们在备份和重新导入数据的时候,如果数据量很大的话,要很几个小时才能完成。这个时候可以先把index删除掉。导入在建index。 |
| 7.外键关联的删除 |
| 如果表的有外键的话,每次操作都没去check外键整合性。因此比较慢。数据导入后在建立外键也是一种选择。 |
| 8.增加maintenance_work_mem参数大小 |
| 增加这个参数可以提升CREATE INDEX和ALTERTABLE ADD FOREIGN KEY的执行效率。 |
| 9.增加checkpoint_segments参数的大小 |
| 增加这个参数可以提升大量数据导入时候的速度。 |
| 10.设置archive_mode无效 |
| 这个参数设置为无效的时候,能够提升以下的操作的速度 |
| ?CREATE TABLE AS SELECT |
| ?CREATE INDEX |
| ?ALTER TABLE SETTABLESPACE |
| ?CLUSTER等。 |
| 11.最后执行VACUUM ANALYZE |
| 表中数据大量变化的时候建议执行VACUUMANALYZE。 |
浙公网安备 33010602011771号