国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

簡單試驗一下Bulk Binds對性能的提高

2024-07-21 02:39:19
字體:
來源:轉載
供稿:網友

  當Oracle運行PL/SQL時會使用兩套引擎,所有PRocedural code由PL/SQL engine 完成,所有SQL由SQL engine處理。 所以假如Oracle從一個collection中循環執行相同的DML操作,那么為了避免兩套engine切換所消耗的系統資源,可以使用bulk binds來把所有的DML操作binding到一次操作中完成。這將極大提高PL/SQL的執行效率。 
  以下是簡單的測試,用兩種方式插入100000條數據,可以看到效率提高了7倍左右。 
  
  代碼:--------------------------------------------------------------------------------
  SQL> CREATE TABLE test1(
   2  id      NUMBER(10),
   3  description VARCHAR2(50));
  
  Table created
  
  SQL> ALTER TABLE test1 ADD (
   2  CONSTRAINT test1_pk PRIMARY KEY (id));
  
  Table altered
  
  SQL> SET TIMING ON;
  
  SQL> DECLARE
   2  TYPE id_type     IS TABLE OF test1.id%TYPE;
   3  TYPE description_type IS TABLE OF test1.description%TYPE;
   4 
   5  t_id      id_type     := id_type();
   6  t_description description_type := description_type();
   7 BEGIN
   8  FOR i IN 1 .. 100000 LOOP
   9   t_id.extend;
   10   t_description.extend;
   11 
   12   t_id(t_id.last)          := i;
   13   t_description(t_description.last) := 'Description: ' To_Char(i);
   14  END LOOP;
   15 
   16  FOR i IN t_id.first .. t_id.last LOOP
   17   INSERT INTO test1 (id, description)
   18   VALUES (t_id(i), t_description(i));
   19  END LOOP;
   20 
   21  COMMIT;
   22 END;
   23 /
  
  PL/SQL procedure sUCcessfully completed
  
  Executed in 141.233 seconds
  
  SQL> truncate table test1;
  
  Table truncated
  
  Executed in 0.631 seconds
  
  SQL> 
  SQL> DECLARE
   2  TYPE id_type     IS TABLE OF test1.id%TYPE;
   3  TYPE description_type IS TABLE OF test1.description%TYPE;
   4 
   5  t_id      id_type     := id_type();
   6  t_description description_type := description_type();
   7 BEGIN
   8  FOR i IN 1 .. 100000 LOOP
   9   t_id.extend;
   10   t_description.extend;
   11 
   12   t_id(t_id.last)          := i;
   13   t_description(t_description.last) := 'Description: ' To_Char(i);
   14  END LOOP;
   15 
   16  FORALL i IN t_id.first .. t_id.last
   17   INSERT INTO test1 (id, description)
   18   VALUES (t_id(i), t_description(i));
   19 
   20  COMMIT;
   21 END;
   22 /
  
  PL/SQL procedure successfully completed
  
  Executed in 27.52 seconds
  
  SQL> select count(*) from test1;
  
   COUNT(*)
  ----------
    100000
  
  Executed in 0.04 seconds
  
  SQL>--------------------------------------------------------------------------------
  
   下面我們使用上面那個例子中插入的100000條數據,來測試一下BULK COLLECT的威力。
 
  
  
  代碼:--------------------------------------------------------------------------------
  SQL> SET TIMING ON;
  SQL> 
  SQL> DECLARE
   2  TYPE id_type     IS TABLE OF test1.id%TYPE;
   3  TYPE description_type IS TABLE OF test1.description%TYPE;
   4 
   5  t_id      id_type     := id_type();
   6  t_description description_type := description_type();
   7 
   8  CURSOR c_data IS
   9   SELECT *
   10   FROM  test1;
   11 BEGIN
   12  FOR cur_rec IN c_data LOOP
   13   t_id.extend;
   14   t_description.extend;
   15 
   16   t_id(t_id.last)          := cur_rec.id;
   17   t_description(t_description.last) := cur_rec.description;
   18  END LOOP;
   19 END;
   20 /
  
  PL/SQL procedure successfully completed
  
  Executed in 2.974 seconds
  
  SQL> 
  SQL> DECLARE
   2  TYPE id_type     IS TABLE OF test1.id%TYPE;
   3  TYPE description_type IS TABLE OF test1.description%TYPE;
   4 
   5  t_id      id_type;
   6  t_description description_type;
   7 BEGIN
   8  SELECT id, description
   9  BULK COLLECT INTO t_id, t_description FROM test1;
   10 END;
   11 /
  
  PL/SQL procedure successfully completed
  
  Executed in 0.371 seconds
  
  SQL>--------------------------------------------------------------------------------
  
  結論:當我們需要將大量的檢索結果放入一個collection的時候,使用bulking將比直接使用cursor循環有效的多。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 黔西县| 五河县| 克拉玛依市| 关岭| 卢湾区| 饶阳县| 霍城县| 新建县| 三河市| 濉溪县| 安庆市| 翁牛特旗| 永安市| 南陵县| 锡林浩特市| 寻乌县| 乐业县| 攀枝花市| 永修县| 玛多县| 大名县| 资阳市| 琼中| 富民县| 微山县| 青海省| 稻城县| 永和县| 齐齐哈尔市| 遂平县| 凤山县| 阜新| 临夏市| 建平县| 彭水| 永安市| 高密市| 定日县| 延边| 鲜城|