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 函数

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2985386.html
Copyright © 2011-2022 走看看