PLSQL程序中的上下文切換(context switch)是指SQL和PLSQL編譯環境之間的切換,大量的上下文切換會導致程序運行效率低下。
PLSQL是一種過程性語言,而SQL不是過程性語言。
PLSQL代碼會被編譯成機器語言,在運行時虛擬機會把這些處理解釋成過程性語言。
SQL和PLSQL兩個環境是相對獨立的,可以單獨運行PLSQL代碼,也可以單獨運行SQL代碼。
但是SQL調用PLSQL就會產生一定的開銷(所謂的hit),
begin
for x in (select * from t_a )
loop
insert into t_b values ...
end loop;
end;
上面的代碼中select * from t_a是SQL,每執行一個loop就切換到insert(PLSQL環境),會產生一定的調用消耗。
而PLSQL調用SQL會好一些,比如下面這個把select(SQL)內置到insert語句(PLSQL)
insert into t_b select * from t_a;
如何減少上下文切換:
1.儘可能使用本地SQL函數(在內核中實際是“C”語言),(比如用CASE,DECODE和其他的標量子查詢來完成)
2.用結果緩存,比如deterministic
3.用FORALL取代FOR
總之,在寫代碼時碰到大批量重複操作、循環操作時,想一下是否存在上下文切換。