0

データベースを別のデータベースに移行する必要があります。私はそれを簡単にするためにdblinkを持っています。表から列のコメントと説明をコピーしようとしていることを知ってください。問題は、型がCLOBであるということです。新しいデータベースでは、VARCHAR2を使用しています。回避策を使用して、グローバル一時テーブルを作成しました。

create global temporary table Comments
 (id number,description clob, comment clob) ON COMMIT PRESERVE ROWS; -

  insert into  Comments Select id,description,comment from database.test@DBLINK;

これで、テーブルに52K行があります

次に、新しいデータベースに新しいテーブルテストを作成します。

CREATE TABLE "TEST"
(
"ID"             NUMBER(9,0) NOT NULL ENABLE,
"NAME"             VARCHAR2(255) ,
"DESCRIPTION"             VARCHAR2(4000) ,
"COMMENT"             VARCHAR2(4000) ,
CONSTRAINT "TEST_PK" PRIMARY KEY ("ID")
);

そして今、私は値を挿入しようとします:

insert into TEST(ID, NAME,DESCRIPTION, COMMENT)
 select Test_seq.nextval,Name,
  (select dbms_lob.substr(DESCRIPTION, 4000, 1) from  Comments b where b.id =a.id),
(select dbms_lob.substr(COMMENT, 4000, 1) from  Comments b where b.id =a.id),
from database.test@DBLINK a;

問題は、値を挿入するのにtooooooooooooo時間がかかることです。開始しましたが、30分経っても終了しませんでした。

varchar2で変換クローブを取得し、それらを他のOracleデータベースのテーブルに挿入する高速な方法はありますか?

手伝ってくれてありがとう!

4

1 に答える 1

2

一時テーブルのすべての列をコピーしてから、メインテーブルにクエリを実行しないでください。

CREATE GLOBAL TEMPORARY TABLE comments ON COMMIT PRESERVE ROWS 
    AS SELECT * FROM test@db;

SELECT INTO TEST(ID, NAME,DESCRIPTION, COMMENT)
SELECT ID, NAME, 
       dbms_lob.substr(description, 4000, 1), 
       dbms_lob.substr(description, 4000, 1)
  FROM comments;

インデックスのないテーブルでインライン結合を実行しているため、クエリにはおそらく多くの時間がかかります(各行はフルスキャンを実行します!)。

于 2012-09-03T14:26:14.050 に答える