在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
![](http://img.blog.itpub.net/blog/attachment/201401/17/17013648_1389927286E2SN.png?x-oss-process=style/bb)
点击(此处)折叠或打开
- 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
![](http://img.blog.itpub.net/blog/attachment/201401/17/17013648_1389927350r6RQ.png?x-oss-process=style/bb)
| 函数调用 | 表连接 |
执行时间 | 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
![](http://img.blog.itpub.net/blog/attachment/201401/17/17013648_1389927436YSRr.png?x-oss-process=style/bb)
点击(此处)折叠或打开
- --查看函数调用次数
- SELECT userenv(\'client_info\') FROM dual;
- USERENV(\'CLIENT_INFO\')
- ----------------------------------------------------------------
- 75559
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1072037/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1072037/