oracle 百萬條資料 update所有記錄時的 sql 執行效率問題
阿新 • • 發佈:2019-02-03
需求:
有一張臨時表 , 資料總數100w條,
其中
50w條 , state = 1
50w條 , state = 0
因為資料無用 , 所以需要 更新 所有資料的 state 為 1 ;
環境
資料庫 : oracle 11g
作業系統 : win10
開發工具: PL/SQL
方案:
A方案 : update 表名 set state = 1 B方案 : update 表名 set state = 1 where state = 0; 上邊兩種方案 , 哪種執行效率更高
測試結果
加了 where state = 0; 條件的 sql 效率更高 , 執行時間為 13秒 ;
不加條件更新所有的 sql ,執行時間為25秒, 慢了一倍的時間;
下邊是測試sql, 有興趣的自己測一下
--建立測試表 create table test_update_speed( ID number(32), CREATETIME varchar2(32), ADDER_ID varchar2(32), ADDER_NAME varchar2(32), SOURCE_TYPE varchar2(32), STATE number(1) ); --插入100w資料,其中 前 50w條 state=0,另外50w,state=1 begin for i in 1 .. 1000000 loop if i <= 500000 then insert into test_update_speed values (i, '11', '22', '33', '44', 0); else insert into test_update_speed values (i, '11', '22', '33', '44', 1); end if; end loop; commit; end; -- 查看錶,記錄數 select count(*) from test_update_speed where state=0; select count(*) from test_update_speed where state=1; --測試 使用 方案A , 直接更新表, 觀察時間 ; 結果 執行時間為(測了兩次) : 25.556 seconds , 27.318 seconds update test_update_speed set state = 1; commit; -- 將 前50w條資料再 置為0 update test_update_speed set state = 0 where id between 1 and 500000; commit; --測試使用 方案B , 加上 條件 , 觀察效果; 結果執行時間為 (測了兩次) : 13.403 seconds , 14.614 seconds update test_update_speed set state = 1 where state = 0; commit; -- 結果證明 加 where 條件的 執行效率更高 -- 刪除測試表 drop table test_update_speed;