Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle 12C:截断后插入脚本花费的时间太长_Sql_Oracle_Performance - Fatal编程技术网

Sql Oracle 12C:截断后插入脚本花费的时间太长

Sql Oracle 12C:截断后插入脚本花费的时间太长,sql,oracle,performance,Sql,Oracle,Performance,我们有一个使用Oracle 12C的生产环境。它有两个实例,正在使用Oracle Data Guard在另一台服务器中创建副本。 每次发布新版本时,我们都必须截断一些没有任何索引的表,并使用INSERT语句执行多个脚本,如下所示: ALTER TABLE T_I18N DISABLE ALL TRIGGERS; TRUNCATE TABLE T_I18N; INSERT INTO T_I18N VALUES ('sp', 'Table 1', '0', 'Tabla 1'); INSERT IN

我们有一个使用Oracle 12C的生产环境。它有两个实例,正在使用Oracle Data Guard在另一台服务器中创建副本。 每次发布新版本时,我们都必须截断一些没有任何索引的表,并使用INSERT语句执行多个脚本,如下所示:

ALTER TABLE T_I18N DISABLE ALL TRIGGERS;
TRUNCATE TABLE T_I18N;
INSERT INTO T_I18N VALUES ('sp', 'Table 1', '0', 'Tabla 1');
INSERT INTO T_I18N VALUES ('sp', 'Table 2', '0', 'Tabla 2');
INSERT INTO T_I18N VALUES ('sp', 'Table 3', '0', 'Tabla 3');
.
.
ALTER TABLE HIS_I18N ENABLE ALL TRIGGERS;
在此之前,我们还禁用了所有主键和外键。为了提供更多信息,表结构如下所示:

CREATE TABLE "T_I18N" 
   ("T_CODE" VARCHAR2(5 BYTE), 
    "T_KEY" VARCHAR2(200 BYTE), 
    "T_C_ID" NUMBER(6,0), 
    "T_VALUE" VARCHAR2(500 BYTE), 
     CONSTRAINT "HIN_PK" PRIMARY KEY ("T_CODE", "T_KEY", "T_C_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TB1"  ENABLE, 
     CONSTRAINT "HIN_CEN_FK" FOREIGN KEY ("T_C_ID")
      REFERENCES "TB1"."T_CEN" ("T_C_ID") ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TB1";
包含更多Insert语句的脚本大约有20K,执行大约需要12分钟。在我看来,这花费了太多的时间,所以我采取了不同的方法。我试图删除表,重新创建它,然后执行脚本,只花了40秒

我一直在Oracle网站上搜索,以了解为什么删除/重新创建和截断之间存在如此大的差异,但不幸的是,我找不到任何线索

提前谢谢。任何信息或建议都将不胜感激


干杯

这里没有普遍适用的答案。我们希望插入到空表中所需的时间应该相同,无论该表是如何空的。可能有些差异你还没有告诉我们。所以,你需要提供更多关于你的情况的信息。例如,这是可重复的吗?考虑在INSERT语句中使用/*+APPENT/INTUT。这告诉Oracle使用直接路径插入。但我不确定这是否是瓶颈——瓶颈可能是网络或SQL解析太多的语句。可能是您只是禁用和启用触发器,而不是删除和重新创建触发器导致了速度减慢;但是12分钟加载20000行太长了。您可能需要启用跟踪(DBMS_SESSION.SESSION_TRACE_enable和_DISABLE)并尝试这两种方法(在单独的会话中跟踪每个方法),然后使用tkprof查看发生了什么,因为APC说表/索引的某些其他属性一定会导致这种情况。但有几件事需要尝试。截断时添加
重用存储
。还可以尝试刷新共享池和缓冲池。只是想看看它是否有任何效果。如果你不能用DML得到你想要的性能,也许考虑使用SQL加载器(例如)的直接路径负载。