ITPub博客

首页 > 数据库 > Oracle > sql改写

sql改写

原创 Oracle 作者:哎呀我的天呐 时间:2015-04-03 15:23:23 0 删除 编辑

                   创建表和存储过程

点击( 此处 )折叠或打开

  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博客 ” ,链接:https://blog.itpub.net/29990276/viewspace-1485366/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
https://cloud.tencent.com/developer/inventory/14362

注册时间:2014-10-30

  • 博文量
    403
  • 访问量
    2528705