Mange gange vil databasens ydeevne være langsom. Vi er først nødt til at finde ud af, om der er en scanning af et stort bord i fuld tabel.
Lad os først tjekke, hvad der er fuld tabelscanning, og derefter vil vi se forespørgslen for at finde fuld tabelscanninger i oracle
Hvad er Full table Scan
- Fuld tabelscanning er en af de adgangsmetoder, der bruges af Optimizer. I denne scannes alle blokke i tabellen (op til HWM), og WHERE-klausulens filterbetingelser anvendes, og rækker, der opfyldte filterbetingelsen, returneres. Forklar planen vil se sådan her
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
- Fuld tabelscanning scannede tabellen ved hjælp af multiple bloklæsning. Flere blokke scannet for hver IO –> færre IO-handlinger udføres
- db_multiblock_read_count init.ora parameter bestemmer antallet af multiblok. Den seneste version, Oracle selv justerer denne parameter i henhold til systemet, og du behøver ikke at definere den
- Hvad er HWM – High Water Mark :Det er grænsen, der adskiller de blokke, der indeholder eller har indeholdt data, fra de blokke, der aldrig er blevet indsat i. Antallet af blokke under HWM kan fås gennem blokke-kolonnen i dba_tables-visningen
forespørgsel for at finde fuld tabelscanninger i 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 /
Ovenstående forespørgsel vil rapportere enhver aktuel fuld tabelscanning, der foregår i databasen. Du kan finde tabelnavnet fra nedenstående forespørgsel
select segment_name
from dba_extents
where file_id = &fileid
and &block between block_id and block_id + blocks - 1
;
Hvis du ønsker at se historikken for hele den aktuelle session i databasen til fuld tabelscanning, kan vi bruge nedenstående forespørgsel
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
/
Hvis du ønsker at finde al den sql, der er cachelagret i bibliotekets cache for fuld tabelscanningserklæring
select sql_id,object_owner,object_name from V$SQL_PLAN where
operation='TABLE ACCESS' and
options='FULL' and
object_owner <> 'SYS';
Du kan få den fulde tekst fra sql_id ved at bruge nedenstående forespørgsel
SELECT sql_text, parsing_schema_name, module FROM v$sql WHERE sql_id = '&1'
Sådan undgår du fuld tabelscanning i Oracle
Fuld bordscanning er ikke nødvendigt ondt. Oracle Optimizer vælger planen baseret på datapunkt. Hvis den har valgt fuld datascanning, så har den bestemt fundet det godt. Også ret ofte er indeksscanning måske ikke godt for forespørgslen, og det er dyrest end fuld tabelscanning. Så vi skal analysere grundigt, før vi træffer nogen beslutning om fuld bordscanning
Følgende er nogle af de ting, der skal kontrolleres
(a) Stale Optimizer-statistikker:Tjek venligst, om optimeringsstatistikken, der er tilgængelig i tabellerne, er aktuelle og ikke adskiller sig meget fra faktiske data
(b) Tjek indekser og indeks clustering factor :Du mangler muligvis de rigtige indekser
(c) Forespørgslen bruger muligvis parallel-klausul og vælger Fuld tabelscanning som optimal plan
(d) Forkerte parameterindstillinger for Optimizer_mode,optimizer_index_cost_adj, optimizer_index_caching
Nogle gange hjælper det at køre sql tuning advisor på forespørgslen
Relaterede artikler
forklar plan i Oracle :Alt om Forklar Plan i Oracle, Sådan læser du Oracle Forklar plan for præstationsrelateret problem, hvordan finder du forklaringsplanen for forespørgsel i markøren
hvad er logisk læst i Oracle :hvad er logisk læsning i oracle og fysisk I/O i Oracle,Hvilket er bedre logisk og fysisk I/O med hensyn til ydeevne, forespørgsler om at finde fysiske læsninger
sql tuning advisor :Sådan kører du sql tuning advisor for sql_id i markøren cache, hvordan oprettes og udføres sql-indstillingsopgaven for at få anbefalingen
find indekser på en tabel i Oracle:tjek denne artikel for at finde forespørgsler om, hvordan man finder indekser på en tabel i Oracle, liste alle indekser i skemaet ,indeksstatus, indekskolonne
bindingsvariabler i Oracle :Bindvariabler er pladsholderen for værdier i sqlplus og PLSQL, og den erstattes med værdier, når sætningen udføres
hvordan kontrolleres sql-profil i Oracle :Tjek ud af dette indlæg om, hvordan man tjekker sql-profil i Oracle, hvordan man finder indholdet af sql prof ile, hvordan man dropper sql-profilen