--------------------------大量插入
使用sql loader direct path 选项
在direct path模式中,sql*loader 创建格式化的数据块并且直接写入到数据文件,这需要经常检查数据库以获得数据块的新位置,但不需要其他使用数据库内核的I/O。
在conventional path模式中,sql*loader从文件中读取记录生成insert命令.并且将他们传递到oracle内核,然后oracle在表中的空闲块中为这些记录查找存放空间,并且更新任何相关的索引。
如果索引表,索引将在加载期间处于direct path状态,加载完成后,排序新的键(索引列值)并且将其与索引中已有的键合并在一起,为了维护临时的一组键,加载过将程创建一个临时索引段,该段
至少与表上的最大索引一样大。通过预先排序数据并在sql*loader控制文件中使用sorted indexes子句,可以最小化这种情况的空间需求。
为了最小化在加载期间必需的动态空间分配数量。正在加载进来的数据段应该是已经创建的数据段,并且已经分配了所需要的全部空间,也应该预先排序表中最大索引的列上的数据,相比于在加载之前删除
索引,然后在加载完成后重新创建这些索引,在direct path加载期间排序数据并保留表上的索引通常会产生更好的性能。
为了利用direct path选项,不可以集群表,也不可以有针对它的其他活动事务,在加载期间,只实施not null,unique,primary key约束,
在加载完成后,可以动态重新启用check和foregin key约束。
为了为迫使发生这种重新应用过程,在sql*loader控制文件中使用如下子句:reenable disable constraints
这种重新启用过程的唯一例外时插入触发器。在重新启用时,不会为表中的每个新行执行表插入触发器。
直接加载比传统加载提供了更多的性能改进,其方法是绕开sql处理。缓冲区缓存管理以及不必要的数据快读取。
--------------并行加载
sql*loader的parallel data loading 选项允许使用多个进程将数据加载到相同的表中,利用系统上多余的资源,
从而减少加载过程整个消耗的时间,假设没有足够的cpu和I/O资源,这样做就可以极大地减少全表的加载次数。
为了使用parallel data loading使用parallel关键字启动多个sql*loader会话。否则sql*loader 会在表上放置一个独占的锁。每个会话都是独立的会话,需要有自己的控制文件。
sqlload userid= control=part1.ctl direct=true parallel=true
因为具有多个将数据加载到相同表中的会话,所以对于parallel data loading。只允许append选项,而对于parallel data loading,不允许sql*loader replace truncate insert选项
如果使用parallel data loading.sql*loader 不会维护索引,在启动加载进程之前,必须删除表上的所有索引。并且禁用它的所有primary key和unique约束,在加载完成后,可以重新创建表的索引。
1.在串行的direct data loading(paraller=false) 中,sql*loader 将数据加载到表中的盘区中,如果加载进程在加载完成之前失败,一些数据可能会在过程失败之前提交给表
2.在parallel data loading 中,每个加载过程,每个加载过错为加载数据创建临时段,临时段在后面与表合并在一起。如果parallel data loading过程在加载完成之前失败,临时段就不会与表合并。
如果临时段没有与加载的表合并,该加载过程中的任何数据都不会提交到表中。
3.可以使用sql*loader file 参数将每个数据加载会话定向到不同的数据文件。通过定向每个数据加载会话到它子句的数据文件,可以平衡加载过程的I/O加载,数据加载时非常I/O密集的加载,必须为并行加载分布到多个磁盘上,从而获得比串行加载更有效的性能改善。
4.parallel data loading后,每个会话可能尝试重新启用表的约束,只要至少一个会话仍然进行中,则尝试重新启用约束就会失败,最后一个完成的加载会话应该尝试重新启用约束,并且应该会成功。
应该咋加载晚餐后检查约束的状态,如果加载的表具有primary key和unique约束定可以在启用约束前并行创建的相关索引。
------------------------------------------------外部表
外部表允许用户访问数据源。表的元数据存储在oracle数据字典中,但表的内容存储在外部。
通过create table 命令的organization external子句定义表的结构。
1.必须创建一个目录对象以指向存储该文本文件的操作系统目录
create directory empt_dir as '/u01/employee_comments';
2.create table empl_sugg (employee_id number,employee_comment varchar2(20))organization external (
type oracle_loader
default directory empl_dir
access prameters
(records delimibed by newline
fields terminated by ','
(employee_id char,
employee_comment char))
location('empl_sugg.txt');
第一部分是从数据库用户的角度观察的表定义
第二部分用于区分外部表和普通表,这是数据库列和外部数据源之间长生映射的位置,数据元素开始于哪些列,列宽是多少,外部列的格式是字符还是二进制
organization external 语句指明该表的数据存储在数据库外面
oracle_loader语句指定访问驱动程序按照只读方式创建和加载一个外部表
location 语句中指定的文件empl_Sugg.txt位于以前创建的oracle目录中
access parameters 指定表中的每一行都在文本文件中其各自的数据行上,并且通过逗号来分割文本文件中的字段。
注:在外部表上不可以创建索引,也不可以执行插入,更新,或删除操作,每次对该表的访问都会产生完整的表扫描(即在操作系统上完整扫描文件)
1.因为数据不是存储在数据库中,并且数据只存储一次,从而节省了空间。
2.因为数据绝对不会加载到数据库中,从而消除了数据加载时间,由于不可以索引外部表,他们可以对于在其中由批处理程序访问大量数据的操作最为有用。
从体系结构的角度来看,外部表允许将数据库内容的重点放在用户最常使用的对象上,小型代码表,聚集表以及事物表,同时在数据库外部保持非常大的数据集,可以在任何时刻替换由外部表访问的文件,
而不会导致数据库中的任何事务系统开始。
--------------------------------大量删除 truncate命令
用户经常会尝试一次性删除表中的所有记录,当他们在这个过程中遇到错误时,就会抱怨回滚段太小,而实际上是事务太大,即使段中不再有任何记录。
它仍然会维持分配给它的所有空间,删除不会节省任何已分配的空间。
truncate命令可解决所有这些问题,这是一个ddl命令,因此不可回滚该命令,一旦已经在表上使用truncate命令,则删除它的记录,并且在该过程中不会执行任何delete触发器。
然而表保留所有相关的对象例如授权,索引和约束
truncate命令是删除大量数据的最快方法,如果使用分区,可以截取表的一个分区,而不会影响表的剩余分区。
1.truncate table employee drop storage;(默认)
drop storage子句用于释放表中非initial的空间,可以删除表的所有行,并且回收所有空间,除了初始盘区的分配空间,而不会删除表。
2.truncate table employee reuse storage;
reuse storage 选项用于在获得它的段中保留所有已分配的空间为空
3.alter table employee truncate partition part3 drop storage;
使用sql loader direct path 选项
在direct path模式中,sql*loader 创建格式化的数据块并且直接写入到数据文件,这需要经常检查数据库以获得数据块的新位置,但不需要其他使用数据库内核的I/O。
在conventional path模式中,sql*loader从文件中读取记录生成insert命令.并且将他们传递到oracle内核,然后oracle在表中的空闲块中为这些记录查找存放空间,并且更新任何相关的索引。
如果索引表,索引将在加载期间处于direct path状态,加载完成后,排序新的键(索引列值)并且将其与索引中已有的键合并在一起,为了维护临时的一组键,加载过将程创建一个临时索引段,该段
至少与表上的最大索引一样大。通过预先排序数据并在sql*loader控制文件中使用sorted indexes子句,可以最小化这种情况的空间需求。
为了最小化在加载期间必需的动态空间分配数量。正在加载进来的数据段应该是已经创建的数据段,并且已经分配了所需要的全部空间,也应该预先排序表中最大索引的列上的数据,相比于在加载之前删除
索引,然后在加载完成后重新创建这些索引,在direct path加载期间排序数据并保留表上的索引通常会产生更好的性能。
为了利用direct path选项,不可以集群表,也不可以有针对它的其他活动事务,在加载期间,只实施not null,unique,primary key约束,
在加载完成后,可以动态重新启用check和foregin key约束。
为了为迫使发生这种重新应用过程,在sql*loader控制文件中使用如下子句:reenable disable constraints
这种重新启用过程的唯一例外时插入触发器。在重新启用时,不会为表中的每个新行执行表插入触发器。
直接加载比传统加载提供了更多的性能改进,其方法是绕开sql处理。缓冲区缓存管理以及不必要的数据快读取。
--------------并行加载
sql*loader的parallel data loading 选项允许使用多个进程将数据加载到相同的表中,利用系统上多余的资源,
从而减少加载过程整个消耗的时间,假设没有足够的cpu和I/O资源,这样做就可以极大地减少全表的加载次数。
为了使用parallel data loading使用parallel关键字启动多个sql*loader会话。否则sql*loader 会在表上放置一个独占的锁。每个会话都是独立的会话,需要有自己的控制文件。
sqlload userid= control=part1.ctl direct=true parallel=true
因为具有多个将数据加载到相同表中的会话,所以对于parallel data loading。只允许append选项,而对于parallel data loading,不允许sql*loader replace truncate insert选项
如果使用parallel data loading.sql*loader 不会维护索引,在启动加载进程之前,必须删除表上的所有索引。并且禁用它的所有primary key和unique约束,在加载完成后,可以重新创建表的索引。
1.在串行的direct data loading(paraller=false) 中,sql*loader 将数据加载到表中的盘区中,如果加载进程在加载完成之前失败,一些数据可能会在过程失败之前提交给表
2.在parallel data loading 中,每个加载过程,每个加载过错为加载数据创建临时段,临时段在后面与表合并在一起。如果parallel data loading过程在加载完成之前失败,临时段就不会与表合并。
如果临时段没有与加载的表合并,该加载过程中的任何数据都不会提交到表中。
3.可以使用sql*loader file 参数将每个数据加载会话定向到不同的数据文件。通过定向每个数据加载会话到它子句的数据文件,可以平衡加载过程的I/O加载,数据加载时非常I/O密集的加载,必须为并行加载分布到多个磁盘上,从而获得比串行加载更有效的性能改善。
4.parallel data loading后,每个会话可能尝试重新启用表的约束,只要至少一个会话仍然进行中,则尝试重新启用约束就会失败,最后一个完成的加载会话应该尝试重新启用约束,并且应该会成功。
应该咋加载晚餐后检查约束的状态,如果加载的表具有primary key和unique约束定可以在启用约束前并行创建的相关索引。
------------------------------------------------外部表
外部表允许用户访问数据源。表的元数据存储在oracle数据字典中,但表的内容存储在外部。
通过create table 命令的organization external子句定义表的结构。
1.必须创建一个目录对象以指向存储该文本文件的操作系统目录
create directory empt_dir as '/u01/employee_comments';
2.create table empl_sugg (employee_id number,employee_comment varchar2(20))organization external (
type oracle_loader
default directory empl_dir
access prameters
(records delimibed by newline
fields terminated by ','
(employee_id char,
employee_comment char))
location('empl_sugg.txt');
第一部分是从数据库用户的角度观察的表定义
第二部分用于区分外部表和普通表,这是数据库列和外部数据源之间长生映射的位置,数据元素开始于哪些列,列宽是多少,外部列的格式是字符还是二进制
organization external 语句指明该表的数据存储在数据库外面
oracle_loader语句指定访问驱动程序按照只读方式创建和加载一个外部表
location 语句中指定的文件empl_Sugg.txt位于以前创建的oracle目录中
access parameters 指定表中的每一行都在文本文件中其各自的数据行上,并且通过逗号来分割文本文件中的字段。
注:在外部表上不可以创建索引,也不可以执行插入,更新,或删除操作,每次对该表的访问都会产生完整的表扫描(即在操作系统上完整扫描文件)
1.因为数据不是存储在数据库中,并且数据只存储一次,从而节省了空间。
2.因为数据绝对不会加载到数据库中,从而消除了数据加载时间,由于不可以索引外部表,他们可以对于在其中由批处理程序访问大量数据的操作最为有用。
从体系结构的角度来看,外部表允许将数据库内容的重点放在用户最常使用的对象上,小型代码表,聚集表以及事物表,同时在数据库外部保持非常大的数据集,可以在任何时刻替换由外部表访问的文件,
而不会导致数据库中的任何事务系统开始。
--------------------------------大量删除 truncate命令
用户经常会尝试一次性删除表中的所有记录,当他们在这个过程中遇到错误时,就会抱怨回滚段太小,而实际上是事务太大,即使段中不再有任何记录。
它仍然会维持分配给它的所有空间,删除不会节省任何已分配的空间。
truncate命令可解决所有这些问题,这是一个ddl命令,因此不可回滚该命令,一旦已经在表上使用truncate命令,则删除它的记录,并且在该过程中不会执行任何delete触发器。
然而表保留所有相关的对象例如授权,索引和约束
truncate命令是删除大量数据的最快方法,如果使用分区,可以截取表的一个分区,而不会影响表的剩余分区。
1.truncate table employee drop storage;(默认)
drop storage子句用于释放表中非initial的空间,可以删除表的所有行,并且回收所有空间,除了初始盘区的分配空间,而不会删除表。
2.truncate table employee reuse storage;
reuse storage 选项用于在获得它的段中保留所有已分配的空间为空
3.alter table employee truncate partition part3 drop storage;