Как эффективно найти SQL_ID оператора SQL? - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь выполнить поиск без учета регистра и пробелов в столбце SQL_FULLTEXT V $ SQLSTAT , чтобы найти SQL_ID, связанный с данным sql. Мое решение слишком неэффективно.

Я ограничил поиск первыми 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 Ответ

1 голос
/ 31 октября 2019

Если вы можете сделать это с первыми 1000 символами, используйте столбец sql_text в представлении v $ sqlarea, что должно ускорить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...