﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font size=5 face="隶书" color="blue"&gt;寒江雪&lt;/font&gt;-文章分类-其他</title><link>http://www.blogjava.net/wenhan-uk/category/25032.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 20 Apr 2012 10:48:02 GMT</lastBuildDate><pubDate>Fri, 20 Apr 2012 10:48:02 GMT</pubDate><ttl>60</ttl><item><title>PostgreSQL 数据库性能提升的几个方面</title><link>http://www.blogjava.net/wenhan-uk/articles/375313.html</link><dc:creator>月月鸟</dc:creator><author>月月鸟</author><pubDate>Thu, 19 Apr 2012 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/wenhan-uk/articles/375313.html</guid><wfw:comment>http://www.blogjava.net/wenhan-uk/comments/375313.html</wfw:comment><comments>http://www.blogjava.net/wenhan-uk/articles/375313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhan-uk/comments/commentRss/375313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhan-uk/services/trackbacks/375313.html</trackback:ping><description><![CDATA[<p>PostgreSQL提供了一些帮助提升性能的功能。主要有一些几个方面。<br /><br /></p>
<p><strong>1.使用EXPLAIN <br /></strong>EXPLAIN命令可以查看执行计划，在前面的blog中已经介绍过。这个方法是我们最主要的调试工具。 <br /></p>
<p><strong>2.及时更新执行计划中使用的统计信息</strong> <br />由于统计 信息不是每次操作数据 库 都 进 行更新的，一般是在 VACUUM 、 ANALYZE 、 CREATE INDEX等DDL执行的时候会更新统计信息， <br />因此执 行 计 划所用的 统计 信息很有可能比 较 旧。 这样执 行 计 划的分析 结 果可能 误 差会 变 大。 </p>
<p>以下是表tenk1的相关的一部分统计信息。 <br />SELECT relname, relkind, reltuples, relpages <br />FROM pg_class <br />WHERE relname LIKE 'tenk1%'; </p>
<p>relname | relkind | reltuples | relpages <br />----------------------+---------+-----------+---------- <br />tenk1 | r | 10000 | 358 <br />tenk1_hundred | i | 10000 | 30 <br />tenk1_thous_tenthous | i | 10000 | 30 <br />tenk1_unique1 | i | 10000 | 30 <br />tenk1_unique2 | i | 10000 | 30 <br />(5 rows) <br />其中 relkind是类型，r是自身表，i是索引index；reltuples是项目数；relpages是所占硬盘的块数。 </p>
<p><strong>3.明确用join来关联表 <br /></strong>一般写法：SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id; <br />如果明确用join的话，执行时候执行计划相对容易控制一些。 <br />例子： <br />SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; <br />SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id); </p>
<p><strong>4.关闭自动提交（autocommit=false）</strong> </p>
<p><strong>5.多次插入数据是用copy命令更有效率</strong> <br />我们有的处理中要对同一张表执行很多次insert操作。这个时候我们用copy命令更有效率。因为insert一次，其相关的index都要做一次，比较花费时间。 </p>
<p><strong>6.临时删除index <br /></strong>有时候我们在备份和重新导入数据的时候，如果数据量很大的话，要很几个小时才能完成。这个时候可以先把index删除掉。导入在建index。 </p>
<p><strong>7.外键关联的删除</strong> <br />如果表的有外键的话，每次操作都没去check外键整合性。因此比较慢。数据导入后在建立外键也是一种选择。 </p>
<p><strong>8.增加maintenance_work_mem参数大小</strong> <br />增加这个参数可以提升CREATE INDEX和ALTER TABLE ADD FOREIGN KEY的执行效率。 </p>
<p><strong>9.增加checkpoint_segments参数的大小 <br /></strong>增加这个参数可以提升大量数据导入时候的速度。 </p>
<p><strong>10.设置archive_mode无效</strong> <br />这个参数设置为无效的时候，能够提升以下的操作的速度 <br />・CREATE TABLE AS SELECT <br />・CREATE INDEX <br />・ALTER TABLE SET TABLESPACE <br />・CLUSTER等。 </p>
<p><strong>11.最后执行VACUUM ANALYZE</strong> <br />表中数据大量变化的时候建议执行VACUUM ANALYZE。</p><img src ="http://www.blogjava.net/wenhan-uk/aggbug/375313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhan-uk/" target="_blank">月月鸟</a> 2012-04-19 23:49 <a href="http://www.blogjava.net/wenhan-uk/articles/375313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>