oracle SQL引擎和PL SQL引擎

2021-06-21 23:56:44 字數 1411 閱讀 9607

如下圖所示,pl/sql引擎會執行過程化語句,但它把sql語句傳送給sql引擎處理,然後sql引擎把處理的結果返回給pl/sql引擎。

pl/sql和sql引擎間的頻繁切換會大大降低效率。典型的情況就是在乙個迴圈中反覆執行sql語句。例如,下面的delete語句就會在for迴圈中被多次傳送到sql引擎中去:

初始化一些資料:

create table emp

( emp_id int primary key,

deptno int not null

);

declare

l_deptno int;

begin

for i in 1..1000000 loop

l_deptno := i mod 4;

insert into emp values (i, l_deptno);

end loop;

commit;

end;

測試1:

sql> declare

2 type numlist is array(20) of number;

3 depts numlist := numlist(0,1,2,3);

4 begin

5 for i in depts.first .. depts.last loop

6 delete from emp where deptno = depts(i);

7 end loop;

8 commit;

9 end;

10 /

pl/sql 過程已成功完成。

測試2:

sql> declare

2 type numlist is array(20) of number;

3 depts numlist := numlist(0,1,2,3);

4 begin

5 forall i in depts.first .. depts.last

6 delete from emp where deptno = depts(i);

7 commit;

8 end;

9 /

pl/sql 過程已成功完成。

關鍵字forall能讓pl/sql引擎在將集合傳送到sql引擎之前,批量匯入集合元素。雖然forall也包含了迭代的模式,但它並不是簡單的for迴圈。

《plsql使用者指南與參考》這本書裡是這樣寫的,可是測試下來,並不是那樣的。

ORACLE SQL過濾和排序資料

在查詢過濾行就是查詢你需要的內容和資料,並進行排序 但是我們過濾的過程中需要的語句是 where where語句是緊隨 from 子句 例如 select sno,sname,sbirthday from student where sname 曾華 紅色部分不論是數字和日期都可以過濾 但是字元和日...

主成分回歸(PCR)和最小二乘回歸(PLS)

主成分回歸 principal components regression,pcr 使用 p1s 庫中的 pcr 渴數實現主成分回歸 pcr install.packages pls library pls set.seed 2 pcr.fit pcr salary data hitters,sca...

Oracle sql的基本優化寫法和思路。

首先簡單介紹下常規的sql優化的方式 1.肯定有人說建索引啊。2.資料量實在太大,建分割槽啊。3.其實基於目前公司的業務還有一種辦法那就是向上聚集表。根據查詢業務,專門抽取上來一張表,直接做到select就好。4.其實還可以把錶細分,然後通過應用控制根據不同條件查詢不同表 其實,我覺著以上這些思路的...