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

  • 相关阅读:
    万字长文|Hadoop入门笔记(附资料)
    大数据最后一公里——2021年五大开源数据可视化BI方案对比
    非结构化数据怎么存?——开源对象存储方案介绍
    (三、四)Superset 1.3图表篇——透视表-Pivot Table
    数据湖搭建指南——几个核心问题
    (二)Superset 1.3图表篇——Time-series Table
    DorisDB升级为StarRocks,全面开源!
    (一)Superset 1.3图表篇——Table
    HCNP Routing&Switching之BGP基础
    HCNP Routing&Switching之路由引入导致的问题及解决方案
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2985386.html
Copyright © 2011-2022 走看看