在不使用Bulk的情况下,insert 同样的数据量,250 colunm的效率差不多等于 25colunm的 4-5倍,但是,25colunm 的使用了 Bulk insert ,使它的执行次数等于 250 colunm之后,效率非常接近
250 colunm * 1000 times = 450 ms
25 column * 10000 times = 2000 ms
(25 colunm * 10 Bulk) * 1000 times = 490 ms
速度差异的关键在于SQL 引擎于PL/SQL引擎的切换上
[php]
-- Create table test250
DECLARE
sql_text VARCHAR2(4096);
BEGIN
sql_text := 'create table test250 (';
FOR i IN 1..249 LOOP
sql_text := sql_text ||' c'||i||' char(9),' ;
Dbms_Output.put_line(Length(sql_text)||' '||i);
END LOOP;
sql_text := sql_text ||' col250 char(9))';
EXECUTE IMMEDIATE sql_text;
END;
/
-- Create table test25
DECLARE
sql_text VARCHAR2(4096);
BEGIN
sql_text := 'create table test25 (';
FOR i IN 1..24 LOOP
sql_text := sql_text ||' c'||i||' char(9),' ;
Dbms_Output.put_line(Length(sql_text)||' '||i);
END LOOP;
sql_text := sql_text ||' col25 char(9))';
EXECUTE IMMEDIATE sql_text;
END;
/
--insert into test250 1000 rows
BEGIN
FOR i IN 0..1000 loop
INSERT INTO test250 VALUES
(
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'
);
END LOOP;
END;
/
--insert into test25 10000 rows ,without bulk insert
BEGIN
FOR i IN 0..10000 loop
INSERT INTO test25 VALUES
(
'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'
);
END LOOP;
END;
/
--insert into test25 10000 rows ,with bulk insert ,execute 1000 times
DECLARE
type char_Table is table of char(9) index by binary_integer;
a char_table;
BEGIN
FOR i IN 0 ..10 loop
a(i) :='a';
END LOOP;
FOR i IN 0..1000 LOOP
FORALL i IN 0..10
INSERT INTO test25 VALUES
(
a(i), a(i), a(i), a(i), a(i),
a(i), a(i), a(i), a(i), a(i),
a(i), a(i), a(i), a(i), a(i),
a(i), a(i), a(i), a(i), a(i),
a(i), a(i), a(i), a(i), a(i)
);
END LOOP;
END;
/
...
[/php] |