如何有效地找到sql语句的SQL_ID?

时间:2019-10-31 20:06:20

标签: sql regex oracle performance plsql

我正在尝试在V$SQLSTAT的SQL_FULLTEXT列上进行不区分大小写和空格的搜索,以便可以找到与给定sql相关联的SQL_ID。我的解决方案效率太低。

我将搜索限制在前1000个字符之内,只是为了使搜索速度更快,但仍然很慢。

DECLARE
  given_sql     CLOB;
  id            VARCHAR2(13);
  smaller_sql   VARCHAR2(1000);
  replace_chars VARCHAR2(6);
BEGIN
    given_sql:= 'long sql statement'
    -- whitespace characters used in TRANSLATE
    replace_chars:= chr(32) || chr(9) || chr(10) || chr(11) || chr(12) || chr(13);
    -- taking substring of given_sql
    smaller_sql:= dbms_lob.substr(given_sql, 1000, 1);
    -- Calling translate to remove extra whitespace and then calling LOWER()
    smaller_sql:= LOWER(TRANSLATE(smaller_sql, replace_chars, ' '));

    -- In the WHERE clause I apply the same process that I applied to smaller_sql to the 
    -- SQL_FULLTEXT column.
    SELECT SQL_ID INTO ID
    FROM V$SQLSTATS stats
    WHERE dbms_lob.compare(LOWER(TRANSLATE(dbms_lob.substr(SQL_FULLTEXT, 1000, 1), replace_chars, ' ')), smaller_sql) = 0;
    dbms_output.put_line(ID);
END;

本质上,我想在CLOB列上进行有效的空白且不区分大小写的搜索。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果可以使用前1000个字符完成操作,请使用v $ sqlarea视图的sql_text列,这样可以加快速度。