zoukankan      html  css  js  c++  java
  • 演示确定共享池中是否存在未绑定变量的 SQL

    本文内容

    • remove_constants 函数
    • 测试环境
    • 测试共享池中是否存在绑定变量的 SQL

    remove_constants 函数


    确定系统中是否存在绑定变量的情况,ASKTOM 网站提供了一个 remove_constants 函数,以检查共享池中 SQL 的运行情况。

    SQL> CREATE OR REPLACE FUNCTION remove_constants (p_query IN VARCHAR2)
      2     RETURN VARCHAR2
      3  AS
      4     l_query       LONG;
      5     l_char        VARCHAR2 (2);
      6     l_in_quotes   BOOLEAN DEFAULT FALSE;
      7  BEGIN
      8     FOR i IN 1 .. LENGTH (p_query)
      9     LOOP
     10        l_char := SUBSTR (p_query, i, 1);
     11
     12        IF l_char = '''' AND l_in_quotes
     13        THEN
     14           l_in_quotes := FALSE;
     15        ELSIF l_char = '''' AND NOT l_in_quotes
     16        THEN
     17           l_in_quotes := TRUE;
     18           l_query := l_query || '''#';
     19        END IF;
     20
     21        IF NOT l_in_quotes
     22        THEN
     23           l_query := l_query || l_char;
     24        END IF;
     25     END LOOP;
     26
     27     l_query := TRANSLATE (l_query, '0123456789', '@@@@@@@@@@');
     28
     29     FOR i IN 0 .. 8
     30     LOOP
     31        l_query := REPLACE (l_query, LPAD ('@', 10 - i, '@'), '@');
     32        l_query := REPLACE (l_query, LPAD (' ', 10 - i, ' '), ' ');
     33     END LOOP;
     34
     35     RETURN UPPER (l_query);
     36  END;
     37  /
     
    函数已创建。
     
    SQL>

    测试环境


    创建表 t,并创建匿名存储过程,执行不绑定变量的 SQL 1000 次。

    SQL> create table t(id int);
     
    表已创建。
     
    SQL> BEGIN
      2     FOR i IN 1 .. 1000
      3     LOOP
      4        EXECUTE IMMEDIATE 'select * from t where id=' || i;
      5     END LOOP;
      6  END;
      7  /
     
    PL/SQL 过程已成功完成。
     
    SQL>

    测试共享池中是否存在绑定变量的 SQL


    利用 v$sqlarea 视图创建表 t1,并调用 remove_constants 进行整理。

    SQL> create table t1 as select sql_text from v$sqlarea;
     
    表已创建。
     
    SQL> alter table t1 add sql_text_wo_constants varchar2(1000);
     
    表已更改。
     
    SQL> UPDATE t1
      2     SET sql_text_wo_constants = remove_constants (sql_text);
     
    已更新3474行。
     
    SQL>   SELECT sql_text_wo_constants, COUNT (*)
      2      FROM t1
      3  GROUP BY sql_text_wo_constants
      4    HAVING COUNT (*) > 100
      5  ORDER BY 2;
     
    SQL_TEXT_WO_CONSTANTS                                COUNT(*)
    -------------------------------------------------- ----------
    SELECT * FROM T WHERE ID=@                               1000
     
    SQL>

    从结果中,刚才执行的 select 语句被反复分析 1000 次,其中谓词条件用 @ 代替。如果绑定了变量,顶多一次。这样,通过这个函数,可以很容易地找到共享池中哪些 SQL 没有绑定变量。

    下载 remove_constants 函数

  • 相关阅读:
    go 注释/说明/文档 标注
    go stack object escape
    ubuntu virtualBox windows10 CPU占用100%
    git 团队合作
    git 修改远程pull和push地址
    go 项目编译失败
    fork函数 linux创建子进程
    51nod1183 编辑距离
    各种平衡树
    redis 配置多个ip 解决方案
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2985386.html
Copyright © 2011-2022 走看看