sql改写

                   创建表和存储过程

点击( 此处 )折叠或打开

  1. CREATE TABLE customers AS

  2. SELECT * FROM sh . customers where country_id in ( 52778 , 52772 ) ;


  3. CREATE OR REPLACE FUNCTION f_count_obj ( p_country_id VARCHAR2 )

  4.   RETURN NUMBER AS

  5.   v_count NUMBER ;

  6. BEGIN

  7.   SELECT COUNT ( * )

  8.      INTO v_count

  9.     FROM customers e26856649_1

  10.    WHERE country_id = p_country_id ;

  11.   RETURN v_count ;

  12. END ;

  13. /


点击( 此处 )折叠或打开

  1. 11 : 01 : 18 SQL > SET timing ON

  2. SET autotrace traceonly

  3. SELECT country_id , cust_first_name , f_count_obj ( country_id ) AS cnt FROM customers ;


  4. 4049 rows selected .


  5. Elapsed : 00 : 00 : 02 . 80


  6. Execution Plan

  7. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  8. Plan hash value : 2008213504


  9. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  10. | Id | Operation          |        Name | Rows | Bytes | Cost ( % CPU ) |      Time |

  11. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  12. |   0 | SELECT STATEMENT   |             | 3936 | 98400 |    33     ( ) | 00 : 00 : 01 |

  13. |   1 |   TABLE ACCESS FULL | CUSTOMERS | 3936 | 98400 |    33     ( ) | 00 : 00 : 01 |

  14. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


  15. Note

  16. - - - - -

  17.     - dynamic sampling used for this statement ( level = 2 )



  18. Statistics

  19. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  20.        4078  recursive calls

  21.       0  db block gets

  22.      437813  consistent gets

  23.       0  physical reads

  24.       0  redo size

  25.       99781  bytes sent via SQL * Net to client

  26.        3478  bytes received via SQL * Net from client

  27.     271  SQL * Net roundtrips to/from client

  28.       0  sorts ( memory )

  29.       0  sorts ( disk )

  30.        4049  rows processed


点击( 此处 )折叠或打开

  1. SQL > SELECT fetches , executions , sql_text

  2. FROM v$sql

  3. WHERE sql_text LIKE '%26856649 _1 %'

  4. AND sql_text NOT LIKE '%v$sql%'

  5. AND sql_text NOT LIKE '%OPT_DYN_SAMP%' ;


  6.    FETCHES EXECUTIONS   SQL_TEXT

  7. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  8.       4049     4049     SELECT COUNT ( * ) FROM CUSTOMERS E26856649_1 WHERE COUNTRY_ID = : B1

我们看到被解析 执行了4049次
下面我们添加如下参数

点击( 此处 )折叠或打开

  1. CREATE OR REPLACE FUNCTION f_count_obj2 ( p_country_id VARCHAR2 )

  2.   RETURN NUMBER DETERMINISTIC AS

  3.   v_count NUMBER ;

  4. BEGIN

  5.   SELECT

  6.    COUNT ( * )

  7.      INTO v_count

  8.     FROM customers e26856649_2

  9.    WHERE country_id = p_country_id ;

  10.   RETURN v_count ;

  11. END ;

  12. /

这里指定别名为_2是为了区分v$sql中的sql_text

点击( 此处 )折叠或打开

  1. SELECT country_id , cust_first_name , f_count_obj2 ( country_id ) AS cnt FROM customers;

点击( 此处 )折叠或打开

  1. 11 : 47 : 07 SQL > SELECT fetches , executions , sql_text

  2.   FROM v$sql

  3.  WHERE sql_text LIKE '%26856649_2%'

  4.     AND sql_text NOT LIKE '%v$sql%'

  5.     AND sql_text NOT LIKE '%OPT_DYN_SAMP%' ;


  6.    FETCHES EXECUTIONS  SQL_TEXT

  7. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  8.        540      540     SELECT COUNT ( * ) FROM CUSTOMERS E26856649_2 WHERE COUNTRY_ID = : B1

结果看到这个被执行解析 540次,时间从2点几秒,变成1.几秒了。。。 。。。

有的时候,说函数很慢让你改,你又不会改,那么在函数里加这个参数,哈哈。

点击( 此处 )折叠或打开

  1. SELECT o . country_id ,

  2.        o . cust_first_name ,

  3.         ( SELECT COUNT ( * ) FROM customers t WHERE t . country_id = o . country_id ) AS cnt

  4.   FROM customers o

改成标量子查询,时间不到1s

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29990276/viewspace-1485366/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29990276/viewspace-1485366/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值