it-swarm-eu.dev

Jaké dotazy provádí Oracle, jak často a časově náročné?

Mám webovou aplikaci (Java), která samozřejmě spouští mnoho dotazů (vybírá, vkládá, aktualizuje, maže) do databáze Oracle.

Chci zjistit následující pro posledních 7 dní:

    SQLQuery          Times-Executed   Average-Resp-Time    Average-Rows-Returned
====================================================================================
    SELECT whatever     981            330ms                1201
    UPDATE whatever     45             99ms                 0

Je to něco, co mi může Oracle dát? Pokud ano, jak to mohu získat? Pokud ne Oracle, měl bych se podívat na ovladač JDBC?

5
Jasper

Poznámka : Použití dat AWR vyžaduje , abyste měli Diagnostický balíček zakoupena možnost licence. Je možné spustit dotazy níže bez nutnosti potřebné licence. Před použitím těchto nástrojů se ujistěte se svým správcem DBA/licencí.

Úložiště automatické zátěže (AWR) obsahuje podrobnosti o činnosti v databázi. Jsou uloženy v různých dba_hist* zobrazení.

Informace, které hledáte, jsou primárně k dispozici v dba_hist_sqlstat Pohled. Připojením se k dba_hist_snapshot můžete získat informace dostupné v daném období:

select * 
from   dba_hist_sqlstat t, dba_hist_snapshot s
where  t.snap_id = s.snap_id
and    t.dbid = s.dbid
and    t.instance_number = s.instance_number
and    s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats

Toto zobrazení obsahuje různé *_elapsed sloupce, které uvádějí nárůst v daném snímku (časové období). např.:

  • ELAPSED_TIME_DELTA
  • CPU_TIME_DELTA
  • ROWS_PROCESSED_DELTA
  • BUFFER_GETS_DELTA
  • DISK_READS_DELTA
  • PARSE_CALLS_DELTA
  • EXECUTIONS_DELTA

Časy jsou v mikrosekundách. Můžete je kombinovat, abyste získali průměrnou dobu/statistiku provádění atd. Takto získáte například průměrnou dobu/provedení pro daný příkaz sql:

select sql_id, sum(t.elapsed_time_delta/1000000)/sum(t.executions_delta)
from   dba_hist_sqlstat t, dba_hist_snapshot s
where  t.snap_id = s.snap_id
and    t.dbid = s.dbid
and    t.instance_number = s.instance_number
and    s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats
group  by sql_id

The sql_id je hash textu samotného SQL. Aktuální výrok najdete na:

select * from dba_hist_sqltext where sql_id = :sqlid

Všimněte si, že v AWR jsou uchovány pouze výkazy „s nejvyšší spotřebou“. Pokud tedy dotaz, který vás zajímá, není nejpomalejší, nejsprávnější, většina přístupu na disk atd., Nemusí to být v datech AWR. Můžete obejít tím, že "obarví" sql_ids zájmu. Tím je zajištěno, že zůstanou v AWR tak dlouho, dokud je nastavena doba uchování. Můžete to udělat spuštěním:

exec DBMS_WORKLOAD_REPOSITORY.ADD_COLORED_SQL(:sqlid);

Pokud chcete pouze přehled vašeho systému v časovém období (včetně „nejtěžších“ příkazů SQL), poskytuje to samotná zpráva AWR. Úvod do tohoto najdete na Oracle-base .

10
Chris Saxon