避免SQL中的函式呼叫
在SQL編碼中,儘量避免在SQL中進行函式呼叫,否則會產生大量的遞迴呼叫而影響效能。
如果用表連線來代替函式呼叫,往往會更高效。點選(此處)摺疊或開啟
-
DROP TABLE people;
-
DROP TABLE sex;
-
CREATE TABLE people (first_name VARCHAR2(200), last_name VARCHAR2(200), sex_id NUMBER);
-
CREATE TABLE sex(NAME VARCHAR2(20), sex_id NUMBER);
-
INSERT INTO people(first_name, last_name, sex_id) SELECT object_name, object_type, 1 FROM dba_objects;
-
-
INSERT INTO sex(name, sex_id) VALUES(\'男\' ,1);
-
INSERT INTO sex(name, sex_id) VALUES(\'女\' ,2);
-
INSERT INTO sex(name, sex_id) VALUES(\'不詳\' ,3);
-
COMMIT;
-
-
CREATE OR REPLACE FUNCTION get_sex_name(p_id sex.sex_id%TYPE) RETURN sex.name%TYPE
-
IS
-
v_name sex.name%TYPE;
-
BEGIN
-
SELECT NAME INTO v_name FROM sex WHERE sex_id = p_id;
-
RETURN v_name;
-
END;
-
/
-
-
--查詢people表的資訊,同時通過sex表,獲取人員的性別資訊
-
SET autotrace traceonly
-
SET timing ON
-
SELECT sex_id, first_name || \' \' || last_name AS full_name, get_sex_name(sex_id) AS gender FROM people;
-
-
75559 rows selected.
-
Elapsed: 00:00:04.68
-
-
Execution Plan
-
----------------------------------------------------------
- Plan hash value: 2528372185
點選(此處)摺疊或開啟
-
SELECT p.sex_id, p.first_name || \' \' || p.last_name AS full_name, sex.name
-
from people p, sex where sex.sex_id = p.sex_id;
-
-
75559 rows selected.
-
-
Elapsed: 00:00:00.49
-
-
Execution Plan
-
----------------------------------------------------------
- Plan hash value: 1973058250
|
函式呼叫 |
表連線 |
執行時間 |
4.68 |
0.49 |
遞迴呼叫 |
75592 |
9 |
邏輯讀 |
534500 |
5564 |
點選(此處)摺疊或開啟
-
--驗證函式呼叫的次數,就是執行計劃中遞迴呼叫的次數
-
--在函式中增加 dbms_application_info.set_client_info(userenv(\'client_info\')+1)。
-
CREATE OR REPLACE FUNCTION get_sex_name(p_id sex.sex_id%TYPE) RETURN sex.name%TYPE IS
-
v_name sex.name%TYPE;
-
BEGIN
-
SELECT NAME INTO v_name FROM sex WHERE sex_id = p_id;
-
dbms_application_info.set_client_info(userenv(\'client_info\') + 1);
-
RETURN v_name;
-
END;
-
-
exec dbms_application_info.set_client_info(\'0\');
-
SET autotrace traceonly
-
SELECT sex_id, first_name || \' \' || last_name AS full_name, get_sex_name(sex_id) AS gender FROM people;
-
-
75559 rows selected.
-
-
Elapsed: 00:00:05.62
-
-
Execution Plan
-
----------------------------------------------------------
- Plan hash value: 2528372185
點選(此處)摺疊或開啟
-
--檢視函式呼叫次數
-
SELECT userenv(\'client_info\') FROM dual;
-
USERENV(\'CLIENT_INFO\')
-
----------------------------------------------------------------
- 75559
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1072037/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 避免對mod函式的呼叫函式
- SQL中呼叫包含dbms_lock.sleep的函式SQL函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 函式呼叫發生在SQL呼叫之前還是過程中函式SQL
- SQL Server SQL語句中的函式呼叫與Oracle SQL語句函式呼叫一個有趣的差別SQLServer函式Oracle
- JS中函式內套函式的呼叫JS函式
- Sql 中的 left 函式、right 函式SQL函式
- C中呼叫Lua函式函式
- SQL中的cast()函式SQLAST函式
- Sql中的getDate()函式SQL函式
- C++中函式呼叫的用法C++函式
- [譯] 解析 Go 中的函式呼叫Go函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 單據列表呼叫自定義SQL函式SQL函式
- Matlab中@與函式呼叫Matlab函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- 函式呼叫中堆疊的個人理解函式
- VB中呼叫WebService上的函式的方法Web函式
- 外部函式的呼叫函式
- 在PowerBuilder中動態呼叫函式UI函式
- SQL中的單記錄函式SQL函式
- vue在一個函式中呼叫另外一個函式Vue函式
- SQL優化] 避免在WHERE子句中對列使用函式SQL優化函式
- java中避免集合死鏈呼叫Java
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- Javascript的函式呼叫與thisJavaScript函式
- 詳解 JS 中 new 呼叫函式原理JS函式
- SQL中的替換函式replace()使用SQL函式
- SQL-Server中datepart函式的使用SQLServer函式
- 轉:類似SQL中的split函式SQL函式
- 子函式呼叫函式
- 函式呼叫棧函式
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- js中的寫出想jquery中的函式一樣呼叫JSjQuery函式
- 【圖文】函式呼叫過程中棧的變化函式
- 執行緒中呼叫fork函式,鎖的變化執行緒函式
- ASP中函式呼叫對引數的影響 (轉)函式
- SQL中 CONVERT轉化函式的用法SQL函式