注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL:测试 maintenance_work_mem 参数对索引创建的影响  

2013-04-27 20:43:48|  分类: PG性能优化 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


       索引创建是数据库管理员的基础工作之一,有时由于业务需求需要对生产库的大表新建索引,
Oracle 创建索引时可以开启并行 目前 PostgreSQL 本身并不提供并行创建索引功能,如何能加
快索引的创建呢?本文测试 maintenance_work_mem 参数对索引创建的影响。
     
     
--创建测试表
 francs=> create table test_1(id int4 primary key, name character varying(64),create_time timestamp without time zone);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_1_pkey" for table "test_1"
CREATE TABLE

francs=> insert into test_1 select generate_series(1,10000000),generate_series(1,10000000)||'_francs',clock_timestamp();
INSERT 0 10000000

francs=> select * From test_1 limit 3;
 id |   name   |        create_time         
----+----------+----------------------------
  1 | 1_francs | 2013-04-27 16:28:11.465584
  2 | 2_francs | 2013-04-27 16:28:11.465928
  3 | 3_francs | 2013-04-27 16:28:11.465943
(3 rows)
 备注:创建一张 1 千万数据的表做测试。

测试一 设置 maintenance_work_mem 为 1MB
 francs=> show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 256MB
(1 row)

francs=> set maintenance_work_mem='1MB';
SET

francs=> show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 1MB
(1 row)
  
--创建索引
 francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 72676.986 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 40593.181 ms
  


测试二 设置 maintenance_work_mem 为 10 MB
 francs=> show maintenance_work_mem ;
 maintenance_work_mem 
----------------------
 1MB
(1 row)

francs=> set maintenance_work_mem ='10MB';
SET

francs=> show maintenance_work_mem ;
 maintenance_work_mem 
----------------------
 10MB
(1 row)
  

--创建索引(先删除之前的两个索引)
 francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
Time: 83767.538 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 47679.868 ms
  

测试三 设置 maintenance_work_mem 为 1 GB
 francs=> show maintenance_work_mem ;
 maintenance_work_mem 
----------------------
 10MB
(1 row)

         
francs=> set maintenance_work_mem ='1GB';
SET

francs=> show maintenance_work_mem ;
 maintenance_work_mem 
----------------------
 1GB
(1 row)
  
--创建索引(先删除之前的两个索引)
 francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 47657.969 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 18953.915 ms
  

测试四 设置 maintenance_work_mem 为 2 GB
 francs=> show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 1GB
(1 row)

francs=> show maintenance_work_mem;
 maintenance_work_mem 
----------------------
 2047MB
(1 row)
  

--创建索引(先删除之前的两个索引)
 francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 50843.263 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 13304.179 ms
  

总结
PostgreSQL:测试 maintenance_work_mem 参数对索引创建的影响 - francs - PostgreSQL DBA
 
  备注:从以上看出,增加 maintenance_work_mem 参数能够加速索引创建,当然不建议在 postgresql.conf
            中设置较大的 maintenance_work_mem,因为 autovacuum 进程消耗的内存受这个参数影响, 一般仅
            在创建索引的 session 设置 session 级 maintenance_work_mem 参数。


  评论这张
 
阅读(8830)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016