Mnohokrát bude výkon databáze pomalý. Nejprve musíme zjistit, zda neprobíhá skenování celé tabulky velkého stolu.
Nejprve se podívejme, co je to Full table scan, a pak uvidíme dotaz na vyhledání full table scans v oracle
Co je skenování celé tabulky
- Úplné prohledávání tabulky je jednou z metod přístupu, kterou používá Optimalizátor. V tomto jsou skenovány všechny bloky v tabulce (až do HWM) a jsou aplikovány podmínky filtru klauzule WHERE a jsou vráceny řádky, které splnily podmínku filtru. Vysvětlení plánu se zobrazí takto
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
- Úplné skenování tabulky naskenovalo tabulku pomocí čtení více bloků. Pro každou IO bylo naskenováno více bloků –> bylo provedeno méně IO operací
- Počet více bloků určuje parametr db_multiblock_read_count init.ora. Nejnovější verze, oracle sám upraví tento parametr podle systému a nemusíte jej definovat
- Co je HWM – High Water Mark:Je to limit, který odděluje bloky, které obsahují nebo obsahovaly data, od bloků, do kterých nikdy nebyly vloženy. Počet bloků pod HWM lze získat pomocí sloupce bloků zobrazení dba_tables
dotaz na vyhledání úplných skenů tabulek v oracle
col event format a25 col module format a50 col File format 9999 col Block format 9999999 set lines 130 set trimspool on select sessw.SID, sessw.EVENT, sessw.p1 "File",sessw.p2 "Block", s.MODULE from v$session_wait sessw, v$session sess where sessw.sid = sess.sid and sessw.event like '%scattered%' order by 1 /
Výše uvedený dotaz bude hlásit veškeré aktuální úplné prohledání tabulky probíhající v databázi. Název tabulky naleznete v dotazu níže
select segment_name
from dba_extents
where file_id = &fileid
and &block between block_id and block_id + blocks - 1
;
Pokud chcete vidět historii všech aktuálních relací v databázi pro úplné skenování tabulky, můžeme použít níže uvedený dotaz
column user_process heading "Name |SID" format a20;
column long_scans heading "Long Scans" format 999,999,999;
column short_scans heading "Short Scans" format 999,999,999;
column rows_retreived heading "Rows Retrieved" format 999,999,999;
set linesize 1000
set timing on
select ss.username||'('||se.sid||') ' "USER_PROCESS",
sum(decode(name,'table scans (short tables)',value)) "SHORT_SCANS",
sum(decode(name,'table scans (long tables)', value)) "LONG_SCANS",
sum(decode(name,'table scan rows gotten',value)) "ROWS_RETRIEVED"
from v$session ss, v$sesstat se, v$statname sn
where se.statistic# = sn.statistic#
and (name like '%table scans (short tables)%'
or name like '%table scans (long tables)%'
or name like '%table scan rows gotten%' )
and se.sid = ss.sid
and ss.username is not null
group by ss.username||'('||se.sid||') '
order by LONG_SCANS desc
/
Pokud chcete najít všechny soubory SQL uložené v mezipaměti knihovny pro příkaz Full table scan
select sql_id,object_owner,object_name from V$SQL_PLAN where
operation='TABLE ACCESS' and
options='FULL' and
object_owner <> 'SYS';
Úplný text můžete získat z sql_id pomocí níže uvedeného dotazu
SELECT sql_text, parsing_schema_name, module FROM v$sql WHERE sql_id = '&1'
Jak se vyhnout úplnému skenování tabulky v Oracle
Kompletní skenování stolu není nutné zlo. Optimalizátor Oracle vybere plán na základě datového bodu. Pokud zvolilo úplné skenování dat, pak to určitě považuje za dobré. Poměrně často také indexové skenování nemusí být dobré pro dotaz a je nejdražší než skenování celé tabulky. Potřebujeme tedy důkladně analyzovat, než přijmeme jakékoli rozhodnutí o úplném prohledání tabulky
Níže jsou uvedeny některé věci ke kontrole
(a) Zastaralé statistiky optimalizátoru:Zkontrolujte, zda jsou statistiky optimalizátoru dostupné v tabulkách aktuální a příliš se neliší od skutečných údajů
(b) Zkontrolujte indexy a index faktor shlukování :Možná vám chybí správné indexy
(c) Dotaz možná používá paralelní klauzuli, a proto jako optimální plán zvolil úplné prohledání tabulky
(d) Nesprávné nastavení parametrů pro Optimizer_mode,optimizer_index_cost_adj, optimizer_index_caching
Někdy pomůže spuštění poradce pro ladění sql na dotaz
Související články
vysvětlení plánu v oracle :Vše o vysvětlení plánu v Oracle, Jak číst oracle vysvětlit plán pro problém související s výkonem, jak najít plán vysvětlení pro dotaz v kurzoru
co je logické čtení v oracle:co je logické čtení v oracle a fyzické I/O v Oracle,Což je lepší logické a fyzické I/O z hlediska výkonu,dotazy k nalezení fyzického čtení
sql tuning poradce :Jak spustit sql tuning poradce pro sql_id v kurzoru cache, jak se vytváří a provádí úloha ladění sql pro získání doporučení
najít indexy v tabulce v oracle:v tomto článku najdete dotazy, jak najít indexy v tabulce v oracle, vypsat všechny indexy ve schématu ,stav indexu, sloupec indexu
bind variables v oracle :Bind variable jsou zástupným symbolem pro hodnoty v sqlplus a PLSQL a při provedení příkazu jsou nahrazeny hodnotami
jak zkontrolovat sql profil v oracle :Zkontrolujte v tomto příspěvku o tom, jak zkontrolovat profil sql v oracle, jak najít obsah sql prof ile, jak zrušit profil SQL