如何高效地查找SQL语句的SQL\u ID?

如何高效地查找SQL语句的SQL\u ID?,sql,regex,oracle,performance,plsql,Sql,Regex,Oracle,Performance,Plsql,我正在尝试对的SQL_全文列进行不区分大小写和空格的搜索,以便找到与给定SQL关联的SQL_ID。我的解决方案效率太低了 我将搜索限制在前1000个字符,只是为了加快搜索速度,但搜索速度仍然很慢 DECLARE given_sql CLOB; id VARCHAR2(13); smaller_sql VARCHAR2(1000); replace_chars VARCHAR2(6); BEGIN given_sql:= 'long sql

我正在尝试对的SQL_全文列进行不区分大小写和空格的搜索,以便找到与给定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列上执行高效的空格和不区分大小写的搜索


感谢您的帮助。

如果您可以使用前1000个字符,请使用v$sqlarea视图的sql_文本列,这样可以加快速度

向我们显示数据库模式、示例数据、当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。不确定如何提供示例数据,因为V$SQLSTATS视图是基于执行的sql语句填充的。V$SQLSTATS.sql_fulltext是CLOB,因此加载它会有开销。sql_文本列可能更有效地检查前1000个字符。