暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无休止地执行get_ddl

askTom 2017-04-03
407

问题描述

你好,

我在执行dbms_metaada.get_ddl时遇到问题。你可以在这里找到有问题的sqript:
https://livesql.oracle.com/apex/livesql/file/content_ES4SXSIQNK2JLYFHH3V752UA6.html

为什么在这种情况下,ddl程序会持续很长时间 (没完没了,超过20小时)?

如何提高性能?

谢谢

专家解答

Eek,您正在临时表空间中创建表!不要那样做!

正如医生所说:

No permanent schema objects can reside in a temporary tablespace.

如果你使用这个,事情不会像你期望的那样工作:

CREATE TABLE TABLE1 ( 
  COL_1  NUMBER(38)                       NOT NULL, 
  COL_2    NUMBER(38)                       NOT NULL, 
  START_DT     DATE                             NOT NULL, 
  END_DT       DATE                             NOT NULL, 
  LOAD_ID      NUMBER(38)                       NOT NULL 
) 
TABLESPACE TEMP ;

insert into TABLE1 values (1, 1, sysdate, sysdate, 1);

SQL Error: ORA-02195: Attempt to create PERMANENT object in a TEMPORARY tablespace


这可能与为什么创建表需要这么长时间有关。剥离表空间部分它对我来说是快速的 (我已经编辑了大部分分区的简洁):

SQL> set sqlbl on
SQL> set timing on
SQL> CREATE TABLE TABLE1 (
  2    COL_1  NUMBER(38)                       NOT NULL,
  3    COL_2    NUMBER(38)                       NOT NULL,
  4    START_DT     DATE                             NOT NULL,
  5    END_DT       DATE                             NOT NULL,
  6    LOAD_ID      NUMBER(38)                       NOT NULL
  7  )
  8  nocompress
  9  RESULT_CACHE (MODE DEFAULT)
 10  PCTUSED    40
 11  PCTFREE    10
 12  INITRANS   1
 13  MAXTRANS   255
 14  STORAGE    (
 15              BUFFER_POOL      DEFAULT
 16              FLASH_CACHE      DEFAULT
 17              CELL_FLASH_CACHE DEFAULT
 18             )
 19  PARTITION BY RANGE (START_DT)
 20  SUBPARTITION BY HASH (COL_1)
 21  (
 22    PARTITION P201409 VALUES LESS THAN (TO_DATE(' 2014-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
 23      NOLOGGING
 24      NOCOMPRESS
 25
 26      PCTUSED    40
 27      PCTFREE    10
 28      INITRANS   1
 29      MAXTRANS   255
 30      STORAGE    (
 31                  MAXSIZE          UNLIMITED
 32                  BUFFER_POOL      DEFAULT
 33                  FLASH_CACHE      DEFAULT
 34                  CELL_FLASH_CACHE DEFAULT
 35                 )
 36      SUBPARTITIONS 32 ,
...
442    PARTITION P999912 VALUES LESS THAN (TO_DATE(' 9999-12-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
443      NOLOGGING
444      NOCOMPRESS
445
446      PCTUSED    40
447      PCTFREE    10
448      INITRANS   1
449      MAXTRANS   255
450      STORAGE    (
451                  MAXSIZE          UNLIMITED
452                  BUFFER_POOL      DEFAULT
453                  FLASH_CACHE      DEFAULT
454                  CELL_FLASH_CACHE DEFAULT
455                 )
456      SUBPARTITIONS 32
457  )
458  NOCACHE
459  NOPARALLEL
460  MONITORING;

Table created.

Elapsed: 00:00:01.16
SQL>
SQL> CREATE UNIQUE INDEX PK_TABLE1 ON TABLE1
  2  (COL_1, COL_2, START_DT)
  3
  4    PCTFREE    10
  5    INITRANS   2
  6    MAXTRANS   255
  7    STORAGE    (
  8                BUFFER_POOL      DEFAULT
  9                FLASH_CACHE      DEFAULT
 10                CELL_FLASH_CACHE DEFAULT
 11               )
 12  LOCAL (
 13    PARTITION P201409
 14      NOLOGGING
 15      NOCOMPRESS
 16
 17      PCTFREE    10
 18      INITRANS   2
 19      MAXTRANS   255
 20      STORAGE    (
 21                  MAXSIZE          UNLIMITED
 22                  BUFFER_POOL      DEFAULT
 23                  FLASH_CACHE      DEFAULT
 24                  CELL_FLASH_CACHE DEFAULT
 25                 )
 26      ,
...
405    PARTITION P999912
406      NOLOGGING
407      NOCOMPRESS
408
409      PCTFREE    10
410      INITRANS   2
411      MAXTRANS   255
412      STORAGE    (
413                  MAXSIZE          UNLIMITED
414                  BUFFER_POOL      DEFAULT
415                  FLASH_CACHE      DEFAULT
416                  CELL_FLASH_CACHE DEFAULT
417                 )
418  )
419  NOPARALLEL;

Index created.

Elapsed: 00:00:01.06
SQL>
SQL> ALTER TABLE TABLE1 ADD (
  2    CONSTRAINT PK_TABLE1
  3    PRIMARY KEY
  4    (COL_1, COL_2, START_DT)
  5    USING INDEX LOCAL
  6    ENABLE VALIDATE);

Table altered.

Elapsed: 00:00:00.31
SQL>
SQL> select dbms_metadata.get_ddl('TABLE', 'TABLE1') from dual;

DBMS_METADATA.GET_DDL('TABLE','TABLE1')
--------------------------------------------------------------------------------

  CREATE TABLE "CHRIS"."TABLE1"
   (    "COL_1" NUMBER(38,0) NOT NULL ENABLE,
        "


Elapsed: 00:00:03.67


如果在正常的表空间上仍然需要20个小时,那就不对劲了。支持下说话!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论