【Oracle】-【索引】先查数据再建索引,还是先建索引再插数据?

问题:

1、新建一个表结构,创建索引,将百万或千万级的数据使用insert导入该表。
2、新建一个表结构,将百万或千万级的数据使用isnert导入该表,再创建索引。

这两种效率哪个高呢?或者说用时短呢?
我感觉无论先建还是后建索引,当有数据时都需要update索引数据,问题是有索引的情况下插数据与有数据的情况下建立索引,各自的消耗。

实验:

100w记录,

1、先创建表和索引,再插入数据,大约1.3min。
2、先插数据,再建立两个索引,create table xxx as select * from t where 1<>1;大约13秒,建立两个索引大约26秒和35秒。

总结:

如果先建立索引再插入数据,每次插入数据还需要修改索引信息。

实战还要看业务要求,有的业务可能还需要索引和约束对数据进行校验,这样就应该先建立索引了。如果是一次性处理,原则上先插数据后建索引。

另外的问题:

使用nologging可以提高几秒钟,但使用parallel没变化,环境是虚机,4个物理CPU,8个虚拟CPU,这里parallel应该如何设置呢?也请高手指教!

时间: 2024-10-09 14:53:57

【Oracle】-【索引】先查数据再建索引,还是先建索引再插数据?的相关文章

mysql-为什么数据库要插入数据后再建B-Tree等结构的索引,而不是边插边建?

问题描述 为什么数据库要插入数据后再建B-Tree等结构的索引,而不是边插边建? 直接插入到B-Tree里不行吗 还有个问题,本来是直接插入到什么数据结构里的? 解决方案 voltDB好像就是往BTree里插的 解决方案二: 应该就是边插边建,除非你用的是事务或者bulkcopy 解决方案三: 索引是要排序的,只有数据插入后的排序才比较稳定,否则,索引的作用体现不出来.

《高并发Oracle数据库系统的架构与设计》一2.5 索引维护

2.5 索引维护 索引对于性能保障的重要性是不言而喻的,一个优质的索引是性能的润滑剂,相反,劣质的索引将是性能的"绞肉机".通过2.4节的介绍,我们了解到一个设计优良的索引,在经过日常业务应用,特别是OLTP的高并发"摧残"之后,将变得满目疮痍,原本优质的索引也可能转变为劣质的. 这就需要DBA的介入,找到劣质的索引,并恢复其优质的本相.索引的后期维护可能是DBA们日常维护工作中非常重要的一部分,同时也可能是最费时费力的一部分.有人可能会简单地概括一下:"

《高并发Oracle数据库系统的架构与设计》一2.3 索引设计优化

2.3 索引设计优化 现在,我们知道了B树索引的结构特点,也了解到其对查询和排序优化的意义,但是这并不代表我们就能建好用好索引了.在实际工作中,是不是还是会遇到走了索引反而查询变慢的情况呢?虽然说不是所有的情况下索引扫描都是优于全表扫描的,但是对于一套设计成熟的系统来说,索引扫描往往是值得坚持的,应该定期进行全库SQL语句执行计划的审查,抓出全表扫描的SQL进行优化. 说一千道一万,我们创建索引就是为了使用索引,尽可能地使查询操作能够走索引.但是,很遗憾,不是我们说走索引就能走索引,还是需要取决

《高并发Oracle数据库系统的架构与设计》一2.1 索引扫描识别

2.1 索引扫描识别 如果把我们的数据库比喻成一座图书馆,那表作为数据的载体,则是一本一本的图书,而索引则是图书的目录.目录不仅让图书阅读和查找变得方便,更是图书成败的关键. 也许有人会说,我翻阅的是一本杂志,内容本就不多,我甚至不需要目录.是的,Oracle数据库也考虑到了这一点,对于数据量很小的表,我们可以不建索引,在查询时可以进行全表扫描(FULL TABLE SCAN),这种方式对于小表来说更适合.但是,如果我们手上是一本大字典呢?你甚至一个人都搬不动它,当然你也不必像看杂志一样每页都去

《高并发Oracle数据库系统的架构与设计》一2.4 索引分裂

2.4 索引分裂 通过前面三节的介绍,相信各位读者已经能对索引的设计及其影响因素有了一定的把握,接下来两节我们将进行到索引新建后的维护阶段.先想一想,索引为什么需要维护?因为它不能保证高效的查询和DML操作,甚至成了一种拖累,或者大家都很"喜欢"它,它有些不堪重负了.这些问题对我们来说都是不能置之不理的,否则宁可不建索引.知其然必知其所以然,要想解决索引的问题,需要先知道这些问题是怎么产生的.我们知道B树索引的结构就像一棵树一样,这棵树随着业务数据的增加,也是会慢慢生长起来的,自然也有

数据库-Oracle中重复率很高的字段创建B树索引,为什么性能可以得到大幅提升

问题描述 Oracle中重复率很高的字段创建B树索引,为什么性能可以得到大幅提升 请教一个让我不解的问题: 我有一张表TT,数据大概是240W,其中的一个字段COL1的值只有'0'和'1'两个.现在有如下查询:SELECT COL2,SUM(NVL(COL3,0) * nvl(COL4,0)) FROM TT WHERE COL1 = '0' GROUP BY COL2; 在查询耗时大概是 50s. 为了提高性能,在TT表的COL1字段上创建了位图索引,查询耗时变为 2s 但是由于我需要对TT表

tushare宏观数据使用pandas入库,增加唯一索引

1,对pandas入数据库 pandas代码中自带了to_sql的方法可以直接使用. 但是数据字段是text的,需要修改成 varchar的,否则不能增加索引. 在增加了主键之后可以控制数据不能再增量修改了. 增加:dtype类型可以解决 dtype={col_name: NVARCHAR(length=255) for col_name in data.columns.tolist()} to_sql 中带的 if_exists 是针对不存在的数据表操作的.而不是数据. 查看了pandas i

IIs5.0建站点--〉第八章 索引服务(续)

索引服务工作原理    索引服务将其所有的索引信息存储在编录中.编录中包含了索引信息和文件系统目录的存储属性.Windows 2000安装索引服务后,将自动构造系统编录和Web编录,前者列出了所有永久连接磁盘驱动器的内容:后者则包含IIS相关的目录内容.    索引服务的实现包括索引过程和查询过程.索引过程    索引过程对待索引文件进行预处理,形成编录文件,使查询工作得以顺利进行.索引过程通常在索引服务初始化时进行.我们可以将这一过程比喻为图书馆的编目工作:在书库中成千上万本书中找到

ORA FAQ 性能调整系列之——当索引第一列由序列产生,一个逆序索引有什么用?

索引|性能 ORA FAQ 性能调整系列之--The Oracle (tm) Users' Co-Operative FAQWhy would a reverse index be useful when the leading column of the index is generated from a sequence ?当索引第一列由序列产生,一个逆序索引有什么用?--------------------------------------------------------------