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

Rud*_*ger 0 oracle indexing

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

Oracle DBA指南:创建大型索引

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

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;
Run Code Online (Sandbox Code Playgroud)

编辑1

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

ORA-00959: tablespace 'TS_TMP' does not exist
Run Code Online (Sandbox Code Playgroud)

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

Qua*_*noi 5

CREATE TEMPORARY TABLESPACE ts_tmp 
TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

ALTER USER me TEMPORARY TABLESPACE ts_tmp;
Run Code Online (Sandbox Code Playgroud)

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

CREATE UNIQUE INDEX big_table_idx ON big_table ( record_id );
Run Code Online (Sandbox Code Playgroud)

这只是创建索引.

DROP TABLESPACE ts_tmp;
Run Code Online (Sandbox Code Playgroud)

这会删除临时表空间.

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

SELECT  temporary_tablespace
FROM    dba_users
WHERE   username = 'ME'
Run Code Online (Sandbox Code Playgroud)

最有可能的是,它会回归TEMP.

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

ALTER USER me TEMPORARY TABLESPACE temp; -- or whatever the previous query returned.
Run Code Online (Sandbox Code Playgroud)