在Oracle中创建一个非常大的索引

时间:2010-01-19 23:44:46

标签: oracle indexing

有人可以查看链接的引用并向我解释要运行的确切语句吗?

Oracle DBA's Guide: Creating a Large Index

这就是我想出来的......

CREATE TEMPORARY TABLESPACE ts_tmp 
TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL;

ALTER USER me TEMPORARY TABLESPACE ts_tmp;

CREATE UNIQUE INDEX big_table_idx ON big_table ( record_id );

DROP TABLESPACE ts_tmp;

修改1

创建此索引后,我为简单查询运行了解释计划并收到此错误:

ORA-00959: tablespace 'TS_TMP' does not exist

看来它根本不是暂时的...... :(

3 个答案:

答案 0 :(得分:5)

CREATE TEMPORARY TABLESPACE ts_tmp 
TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL;

这将创建一个临时表空间(磁盘上将存储中间排序结果的区域)。索引是一组有序数据,排序需要大量空间。

“临时”在这里意味着存储的数据本质上是临时的,而不是表空间本身是临时的。可以把它想象成/tmp中的Unix目录或%TEMP%中折叠的Windows:目录/文件夹本身是永久性的,但存储在其中的数据是临时的。

REUSE表示如果文件已经存在则不会失败(通常在文件名指向原始设备时使用,例如未格式化的磁盘分区,以避免OS文件管理开销。相反,它只会打开文件进行写入并用新数据填充它。如果不是此子句,则如果存在具有给定名称的文件,则命令将失败。

AUTOEXTEND ON表示“根据需要增加文件”。如果将其设置为off并且10Gb将不足以进行排序操作,则表空间将不会自动增长,并且操作将失败。

EXTENT MANAGEMENT LOCAL表示表空间布局存储在表空间本身(而不是系统表中)。不确定11g,但在以前版本的Oracle中,此选项不适用于临时表空间。

ALTER USER me TEMPORARY TABLESPACE ts_tmp;

这使用户me使用新创建的临时表空间作为临时存储介质

CREATE UNIQUE INDEX big_table_idx ON big_table ( record_id );

这只是创建索引。

DROP TABLESPACE ts_tmp;

这会删除临时表空间。

在运行脚本之前,找出当前的默认表空间:

SELECT  temporary_tablespace
FROM    dba_users
WHERE   username = 'ME'

最有可能的是,它会返回TEMP

在删除ts_tmp之前,请为用户恢复默认临时表空间:

ALTER USER me TEMPORARY TABLESPACE temp; -- or whatever the previous query returned.

答案 1 :(得分:0)

关于oracle,表空间有一个小秘密,这个只在oracle中增加,并且永远不会减小,他们在这里尝试做的是避免这种情况,所以它创建一个临时表空间并使用该表空间创建索引然后删除它。

答案 2 :(得分:0)

HWM(高水位线)增加,这取决于您计算使用情况的方式是否已满 - 要查看TEMPORARY表空间的正确用法,请使用V $ SORT_USAGE和V $ SORT_SEGMENT视图。