如何加快建 index 索引 的时间

朋友在500w的表上建索引,半个小时都没有结束。所以就讨论如何提速。


一.先来看一下创建索引要做哪些操作:
1.indexkeydata读到内存
==>如果data没在db_cache中,这时候很容易有大量的dbfilescatterreadwait

2.indexkeydata作排序
==>sort_area_size或者pga_aggregate_target不够大的情况下,需要做disksort,会有大量的driectpathread/write,另外,消耗大量CPUTime

3.创建新的indexsegment,把排过序的indexdata写到所创建的indexsegment里面
==>如果index很大,那么,有时也会有redolog相关等待,如:
logbufferspace,logfilesync,logfileparallelwrite等

所以,在建大表索引时,可以增大pga,增大temptablepace,并且用nologging或并行选项。

如:
createindexidx_logsonlogs(time)nologgingparallel4;

并行度一般看CPU个数。当然在CPU比较空闲的情况下可以多并行几个。对于单CPU不建议用并行,这样反而会增加创建时间。也可以根据v$session_wait的资料,做针对性的tuning,这样可以降低点时间

补充知识:

查看cpu信息:more/proc/cpuinfo

查看内存信息:more/proc/meminfo

查看操作系统信息:more/etc/issue

有关索引概念性的东西,请参考我的Blog:

Oracle索引详解

http://blog.youkuaiyun.com/tianlesoftware/archive/2010/03/05/5347098.aspx

二.测试

自己也测试了下。测试环境:Oracle11gR2,win764bit,CPUT66702.2G双核,内存:4G

1.查看表的数据量:

SQL>selectcount(*)fromcustaddr;

COUNT(*)

----------

7230464

2.查看现有索引:

SQL>selectindex_name,index_typefromuser_indexeswheretable_name='CUSTADDR';

INDEX_NAMEINDEX_TYPE

---------------------------------------------------------

PK_CUSTADDR_TP_723NORMAL

IX_CUSTADDR_ADDRABB_TPNORMAL

IX_CUSTADDR_TEAMID_TPNORMAL

IX_CUSTADDR_CUSTID_TPNORMAL

IX_CUSTADDR_COMPABB_TPNORMAL

IX_CUSTADDR_AREACODENORMAL

IX_CUSTADDR_ADDR_TPNORMAL

已选择7行。

3.删除索引:IX_CUSTADDR_CUSTID_TP


SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

4.默认方式创建索引:


SQL>SETtimingon;

SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID);

索引已创建。

已用时间:00:00:48.37

单位:s

5.用nologging模式:
SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

已用时间:00:00:00.09
SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID)NOLOGGING;

索引已创建。

已用时间:00:00:34.46

6.Nologging+parallel模式

SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

已用时间:00:00:00.17

SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID)NOLOGGINGPARALLEL2;

索引已创建。

已用时间:00:00:52.56

SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

已用时间:00:00:00.07

SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID)NOLOGGINGPARALLEL4;

索引已创建。

已用时间:00:00:53.44

看来在单CPU上,并行效果还不好.

7.Parallel模式

SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

已用时间:00:00:00.02

SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID)PARALLEL2;

索引已创建。

已用时间:00:00:49.97

SQL>dropindexIX_CUSTADDR_CUSTID_TP;

索引已删除。

已用时间:00:00:00.02

SQL>CREATEINDEXIX_CUSTADDR_CUSTID_TPONCUSTADDR(CUSTID)PARALLEL4;

索引已创建。

已用时间:00:00:50.25


从上面的测试数据可以看出,700万的数据,建索引,也在1分钟以内。但是并行在单CPU上效果不明显,而且比光使用NOLOGGING还要慢,因为出现资源争用了,可能是CPU的争用,也可能是I/O的争用。

<!--EndFragment-->

------------------------------------------------------------------------------

Blog:http://blog.youkuaiyun.com/tianlesoftware

网上资源:http://tianlesoftware.download.youkuaiyun.com

相关视频:http://blog.youkuaiyun.com/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1群:62697716();DBA2群:62697977

<!--EndFragment-->

<think>嗯,用户问的是如何评估高斯库中索引所需的时间。首先,我需要确定“高斯库”是指什么。可能是指高斯数据库,比如华为的GaussDB?或者是PostgreSQL的某个版本?根据用户提供的引用内容,里面提到了PostgreSQL的索引扫描方式,比如BitmapScan,所以可能用户是在PostgreSQL的环境下讨论,可能GaussDB是基于PostgreSQL的。不过用户明确提到“高斯库”,所以应该是指GaussDB。 接下来,用户想评估索引时间。我需要考虑评估索引耗时的常用方法。通常来说,索引时间受多个因素影响,比如数据量、表结构、索引类型、硬件性能等。评估方法可能包括实际测量、分析执行计划、使用性能监控工具等。 用户提供的引用[1]提到BitmapScan和索引的ctid集合处理,这可能与索引的创过程有关联吗?不过索引的具体步骤可能涉及数据读取、排序、构结构等。例如,在PostgreSQL中,创索引通常会扫描原表,对相关列进行排序,并构索引结构。这个过程的时间可以通过EXPLAIN ANALYZE来测量,或者在GaussDB中有类似的命令。 另外,用户可能需要考虑并发操作、系统负载、磁盘IO等因素对索引时间的影响。比如,在创索引时是否使用CONCURRENTLY选项,这会影响锁表和执行时间。还有,索引的类型(B-tree、GIN、GiST等)不同,创时间也会不同。 用户可能还想了解如何优化索引时间。比如,调整 maintenance_work_mem参数来增加内存使用,从而减少磁盘IO。或者使用并行构索引的功能,如果数据库支持的话。 此外,用户可能对如何预估索引时间感兴趣,比如通过现有数据量来估算。可能需要先测试小数据量的索引时间,再按比例估算大数据量的情况,不过这种方法可能不准确,因为索引时间复杂度不一定是线性的。 还需要考虑是否有索引日志或监控工具可以记录索引的耗时,比如查看数据库的系统视图或日志文件,获取历史索引时间数据。 可能用户的问题中还隐含了性能调优的需求,比如他们可能遇到索引时间过长的问题,需要找到瓶颈所在。这时候需要分析索引过程中的各个阶段耗时,比如数据扫描时间、排序时间、写入时间等。 总结一下,回答应该包括以下几个步骤:实际测量(使用EXPLAIN ANALYZE)、性能监控(系统视图、日志)、影响因素分析(数据量、索引类型、参数配置)、优化议(调整参数、并行构)。同时需要结合用户提供的引用内容,比如引用[1]中的BitmapScan可能是在索引扫描时的操作,但索引的过程可能不同,不过相关参数调整可能有帮助。 用户可能还希望得到具体的命令示例,比如在GaussDB中如何执行这些步骤,但如果不清楚GaussDB的具体语法,可能需要给出通用的PostgreSQL方法,并议用户参考GaussDB的文档。 最后,生成的相关问题需要围绕索引的性能分析、优化方法、应用场景等方面展开,比如如何选择索引类型,如何优化索引的速度,不同索引类型的适用场景等。</think>### 评估高斯库中索引耗时的步骤方法 #### 1. **实际测量法** - **使用`EXPLAIN ANALYZE`命令** 在创索引时添加`EXPLAIN ANALYZE`可直接获取实际执行时间。例如: ```sql EXPLAIN ANALYZE CREATE INDEX idx_name ON table_name(column_name); ``` 输出结果会包含`Execution Time`字段,精确到毫秒级[^1]。 - **记录时间戳** 手动记录开始和结束时间(适用于无法直接使用`EXPLAIN`的场景): ```sql SELECT clock_timestamp() AS start_time; CREATE INDEX idx_name ON table_name(column_name); SELECT clock_timestamp() AS end_time; ``` #### 2. **性能监控工具** - **系统视图分析** 查询`pg_stat_progress_create_index`视图(PostgreSQL兼容数据库适用),实时监控索引进度: ```sql SELECT * FROM pg_stat_progress_create_index; ``` 可获取已处理的数据块、总块数及耗时比例[^1]。 - **日志分析** 启用数据库的`log_statement`参数(设置为`all`),从日志文件中提取索引语句的执行时间。 #### 3. **影响因素分析** - **数据量与表结构** 数据量$N$与索引耗时通常呈非线性关系,大表需更多I/O和计算资源。公式近似为: $$ T \propto N \cdot \log N \quad (\text{B-tree类索引}) $$ - **索引类型** 不同索引类型(如B-tree、GIN、GiST)耗时差异显著。例如,GIN索引适合全文搜索但构较慢[^1]。 - **参数配置** 调整以下参数可优化耗时: - `maintenance_work_mem`:增加内存分配以减少临时文件写入。 - `max_parallel_maintenance_workers`:启用并行构(若数据库支持)。 #### 4. **优化议** - **并发构** 使用`CONCURRENTLY`选项避免锁表(但耗时可能增加20%-30%): ```sql CREATE INDEX CONCURRENTLY idx_name ON table_name(column_name); ``` - **预排序数据** 若数据已按索引字段排序,可减少构时的比较操作。 --- ### 示例代码(PostgreSQL兼容语法) ```sql -- 查看当前索引参数 SHOW maintenance_work_mem; -- 调整参数并测量时间 SET maintenance_work_mem = '1GB'; EXPLAIN ANALYZE CREATE INDEX idx_sample ON large_table(sample_column); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值