Praca nad oceną wpływu niektórych obecnych baz danych zaplanowanych na emeryturę. Nie jest to możliwe dla indywidualnej komunikacji z użytkownikami, które otrzymały niedawno dotknięte danymi z powodu objętości.

Myślę, że jeśli mogę zrobić jakąś formę wyszukiwania Logika rozmytych, aby uzyskać podobne zapytania przez użytkownika, przy minimalnym czasie mogę zidentyfikować zapytania, które różnią się nieznacznie z powodu oczekiwanych zmian ograniczeń. Chociaż daleko od doskonałości może to pomóc reprezentować zapytania regularnie wspierające ponowne wspieranie funkcji biznesowych VS Pure Ad-Hoc.

Czy ktoś może przedstawić pewne pomysły, które mogą mnie zacząć lub daj znać, czy istnieją jakieś alternatywne pomysły na badania, biorąc pod uwagę moje cele podane powyżej?

1
user2112120 14 kwiecień 2021, 02:05

1 odpowiedź

Najlepsza odpowiedź

Możesz połączyć utl_match, DBA_HIST_SQLTEXT i DBA_HIST_SQLSTAT, aby znaleźć podobne wykonywanie zapytania. Jeśli nie jesteś licencjonowany AWR, czy jesteś zainteresowany tylko ostatnimi zapytaniami, możesz użyć GV $ Sqlstats zamiast tabel DBA_HIST.

Oprócz skomplikowania konieczne będzie dostosowanie niektórych literałów w poniższym zapytaniu na podstawie procesu i błędu. Obecnie wygląda tylko na 10 najczęściej wykonywanych zapytaniu na użytkownika i znajduje tylko 5 najlepszych zapytań, w których wynik podobieństwa jest większy niż lub równy 60%.

--Common queries and the top 5 most-closely related queries.
with statements as
(
    --All relevant SQL statements
    select
        sqlstats.parsing_schema_name,
        sqlstats.total_executions,
        sqltext.sql_id,
        --Convert CLOB to VARCHAR for UTL_MATCH.
        --Won't matter, since we're only interseted in fuzzy matches anyway.
        to_char(substr(sqltext.sql_text, 1, 1000)) sql_text,
        sqltext.command_type
    from
    (
        --All queries in AWR.
        select sql_id, sql_text, command_type
        from dba_hist_sqltext
    ) sqltext
    join
    (
        --Statistics for all queries in AWR.
        select sql_id, parsing_schema_name, sum(executions_delta) total_executions
        from dba_hist_sqlstat
        group by sql_id, parsing_schema_name
    ) sqlstats
        on sqltext.sql_id = sqlstats.sql_id
    order by parsing_schema_name, total_executions desc
)
--Top N most similar queries.
select *
from
(
    --Ranked similarity.
    select
        similarity.*,
        row_number() over (partition by sql_id1 order by similarity desc) top_similarity
    from
    (
        --Similarity between SQL statements for the Top N SQL and other SQL run by the same user.
        select
            top_n.parsing_schema_name, top_n.sql_id sql_id1, top_n.sql_text sql_text1, top_n.total_executions,
            statements.sql_id sql_id2, statements.sql_text sql_text2,
            utl_match.edit_distance_similarity(top_n.sql_text, statements.sql_text) similarity
        from
        (
            --Top N most executed queries.
            select *
            from
            (
                --Most executed queries per user.
                select
                    statements.*,
                    row_number () over (partition by parsing_schema_name order by total_executions desc) top_n 
                from statements
                order by parsing_schema_name, total_executions desc
            )
            where top_n <= 10
        ) top_n
        join statements
            on top_n.parsing_schema_name = statements.parsing_schema_name
            and top_n.command_type = statements.command_type
            and top_n.sql_id <> statements.sql_id
        order by top_n.sql_id, similarity desc, statements.sql_id
    ) similarity
) ranked_similarity
where top_similarity <= 5
    and similarity >= 60
order by parsing_schema_name, sql_id1, top_similarity;
0
Jon Heller 15 kwiecień 2021, 02:16