【问题标题】:Creating an Extremely Large Index in Oracle在 Oracle 中创建超大索引
【发布时间】:2010-05-12 00:22:35
【问题描述】:

有人可以查看链接的参考并向我解释要运行的准确语句吗?

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

看来这根本不是暂时的……:(

【问题讨论】:

    标签: oracle indexing


    【解决方案1】:
    CREATE TEMPORARY TABLESPACE ts_tmp 
    TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
    REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL;
    

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

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

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

    AUTOEXTEND ON 表示“如果需要,增加文件”。如果设置为关闭,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.
    

    【讨论】:

    • 谢谢,但是...您能否查看 DBA 的指南链接,看看我是否正确实现了它?我希望得到对源材料的解释,而不是我写的内容。
    • @Rudiger: 基本上,所有这些只是确保您有足够的磁盘空间来创建索引。是的,您正确地实现了这一点,除了我不确定的EXTENT MANAGEMENT 子句。如果代码没有产生错误,那就没问题了。您唯一错过的是,在删除新创建的表空间之前,您需要将默认用户的表空间恢复为以前的值。
    • ALTER USER 将我的临时表空间重置为原始临时表空间的语句是什么?
    【解决方案2】:

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

    【讨论】:

    • 可以手动减小表空间的大小,但不能收缩它以使其在使用块之前“结束”。也就是说,您有一个 1000 块文件,数据仅在 700 和 750 块之间。您可以将其缩小到 751 块,但不能缩小到 51 块。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多