1. 程式人生 > 實用技巧 >oracle慎用基於on commit重新整理物化檢視的方式(二)

oracle慎用基於on commit重新整理物化檢視的方式(二)

oracle慎用基於on commit重新整理物化檢視的方式(二)

環境模擬

首先,需要有示例使用者SCOTT,以emp表為例子。

首先是序列下無物化檢視的emp表,做update操作的情況,

16:56:14 SYS@zkm(27)> begin
16:56:21   2    for i in 1..10000 loop
16:56:21   3            update scott.emp set sal=9999 where empno=7934;
16:56:21   4            commit;
16:56:21   5    end loop;
16:56
:21 6 end ; 16:56:21 7 / PL/SQL procedure successfully completed. Elapsed: 00:00:00.48 16:56:23 SYS@zkm(27)> begin 16:56:26 2 for i in 1..10000 loop 16:56:26 3 update scott.emp set sal=9999 where empno=7934; 16:56:26 4 commit; 16:56:26 5 end loop; 16:56:26 6 end
; 16:56:26 7 / PL/SQL procedure successfully completed. Elapsed: 00:00:00.65 16:56:27 SYS@zkm(27)> begin 16:56:28 2 for i in 1..10000 loop 16:56:28 3 update scott.emp set sal=9999 where empno=7934; 16:56:28 4 commit; 16:56:28 5 end loop; 16:56:28 6 end ; 16:56:28 7
/ PL/SQL procedure successfully completed. Elapsed: 00:00:00.65

然後是序列下有物化檢視的emp表,做update操作的情況,

17:15:23 SYS@zkm(27)> conn scott/oracle
Connected.
17:15:32 SCOTT@zkm(27)> create materialized view scott.mv_emp
17:15:33   2  REFRESH force on commit
17:15:33   3  as
17:15:33   4  select * from scott.emp;

Materialized view created.

Elapsed: 00:00:00.55
17:15:34 SCOTT@zkm(27)> begin
17:16:06   2    for i in 1..10000 loop
17:16:06   3            update scott.emp set sal=9999 where empno=7934;
17:16:06   4            commit;
17:16:06   5    end loop;
17:16:06   6  end ;
17:16:06   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:21.73
17:16:29 SCOTT@zkm(27)> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:21.64
17:16:53 SCOTT@zkm(27)> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:20.70

可以看到,有物化檢視的情況下,效能下降40多倍。

更不要說在並行情況下產生行級鎖的情況了,幾乎會導致業務都癱瘓掉。

並行下也進行一次模擬看看,開啟兩個session,sid分別為27和31。

刪除上邊的物化檢視,

17:33:58 SCOTT@zkm(27)> drop materialized view scott.mv_emp;

Materialized view dropped.

Elapsed: 00:00:00.50

為了保證同時執行匿名塊,使用crt的command windows功能,將匿名塊同時傳送到活動的會話裡邊,

可以發現,執行時間情況為

17:34:07 SCOTT@zkm(27)> begin
17:34:32   2    for i in 1..10000 loop
17:34:32   3            update scott.emp set sal=9999 where empno=7934;
17:34:32   4            commit;
17:34:32   5    end loop;
17:34:32   6  end ;
17:34:32   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.06
17:34:33 SCOTT@zkm(27)> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.12
17:34:39 SCOTT@zkm(27)> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.17
17:34:43 SCOTT@zkm(27)> 


----------------------------同時sid=31的執行----------------------------- 17:34:16 SCOTT@zkm(31)> begin 17:34:32 2 for i in 1..10000 loop 17:34:32 3 update scott.emp set sal=9999 where empno=7934; 17:34:32 4 commit; 17:34:32 5 end loop; 17:34:32 6 end ; 17:34:32 7 / PL/SQL procedure successfully completed. Elapsed: 00:00:01.13 17:34:33 SCOTT@zkm(31)> / PL/SQL procedure successfully completed. Elapsed: 00:00:01.18 17:34:39 SCOTT@zkm(31)> / PL/SQL procedure successfully completed. Elapsed: 00:00:01.24 17:34:43 SCOTT@zkm(31)>

相對於序列下,效能稍微下降。

再試試有物化檢視下,併發的執行情況,

17:40:44 SCOTT@zkm(27)> create materialized view scott.mv_emp
17:40:44   2  REFRESH force on commit
17:40:44   3  as
17:40:44   4  select * from scott.emp;

Materialized view created.

Elapsed: 00:00:00.03

17:40:47 SCOTT@zkm(27)> begin
17:41:01   2    for i in 1..10000 loop
17:41:01   3            update scott.emp set sal=9999 where empno=7934;
17:41:01   4            commit;
17:41:01   5    end loop;
17:41:01   6  end ;
17:41:01   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:44.82
17:41:46 SCOTT@zkm(27)> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:49.45
----------------------------同時sid=31的執行-----------------------------
17:34:43 SCOTT@zkm(31)> begin 17:41:01 2 for i in 1..10000 loop 17:41:01 3 update scott.emp set sal=9999 where empno=7934; 17:41:01 4 commit; 17:41:01 5 end loop; 17:41:01 6 end ; 17:41:01 7 / PL/SQL procedure successfully completed. Elapsed: 00:00:44.78 17:41:46 SCOTT@zkm(31)> / PL/SQL procedure successfully completed. Elapsed: 00:00:49.32

效能相對序列下降了將近一倍。

如果併發的會話是3個或者更多,那麼預計效能下降會更大,這裡不做測試。