sql >> Databáze >  >> RDS >> Oracle

Dotaz k nalezení úplného skenování tabulky v oracle

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


  1. Oracle:Fulltextové vyhledávání s podmínkou

  2. Základní třída VBA a odvozený objekt-2

  3. Jak dochází k poškození databáze?

  4. Má Oracle koncept filtrovaného indexu?