我正在尝试在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列上进行有效的空白且不区分大小写的搜索。
感谢您的帮助。
答案 0 :(得分:1)
如果可以使用前1000个字符完成操作,请使用v $ sqlarea视图的sql_text列,这样可以加快速度。