Oracle
 sql >> Database >  >> RDS >> Oracle

Query per trovare scansioni di tabelle complete in Oracle

Molte volte le prestazioni del database saranno lente. Dobbiamo prima scoprire  se è in corso una scansione completa di tabelle di grandi dimensioni.

Diamo prima un'occhiata a cos'è la scansione completa della tabella e poi vedremo la query per trovare le scansioni complete della tabella in Oracle

Cos'è la scansione completa della tabella

  • La scansione completa della tabella è uno dei metodi di accesso utilizzati da Optimizer. In questo vengono scansionati tutti i blocchi della tabella (fino a HWM), vengono applicate le condizioni di filtro della clausola WHERE e vengono restituite le righe che soddisfano la condizione di filtro. Il piano Spiega verrà visualizzato in questo modo
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
  • Scansione completa della tabella scansionata la tabella utilizzando la lettura di più blocchi. Scansione di più blocchi per ogni IO –> vengono eseguite meno operazioni IO
  • Il parametro
  • db_multiblock_read_count init.ora decide il conteggio dei multiblocchi. Versione recente, Oracle stesso regola questo parametro secondo il sistema e non è necessario definirlo
  • Cos'è HWM – High Water Mark:è il limite che separa i blocchi che contengono o hanno contenuto dati dai blocchi in cui non sono mai stati inseriti. Il numero di blocchi al di sotto dell'HWM può essere ottenuto tramite la colonna dei blocchi della vista dba_tables

interroga per trovare scansioni complete della tabella in 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
/

La query precedente riporterà qualsiasi scansione completa della tabella corrente in corso nel database. Puoi trovare il nome della tabella dalla query sottostante

select segment_name
from dba_extents
where file_id = &fileid
and &block between block_id and block_id + blocks - 1
;

Se vuoi vedere la cronologia di tutta la sessione corrente nel database per la scansione completa della tabella, possiamo utilizzare la query seguente

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
/

Se vuoi trovare tutto lo sql memorizzato nella cache nella cache della libreria per l'istruzione di scansione completa della tabella

select sql_id,object_owner,object_name from V$SQL_PLAN where
operation='TABLE ACCESS' and
options='FULL' and
object_owner <> 'SYS';

Puoi ottenere il testo completo da sql_id usando la query seguente

SELECT sql_text, parsing_schema_name, module
FROM v$sql
WHERE sql_id = '&1'

Come evitare la scansione completa della tabella in Oracle

La scansione completa della tabella non è necessaria. L'ottimizzatore Oracle sceglie il piano in base al punto dati. Se ha scelto la scansione completa dei dati, l'ha sicuramente trovata bene. Inoltre, molto spesso la scansione dell'indice potrebbe non essere utile per la query ed è più costosa della scansione completa della tabella. Quindi dobbiamo analizzare a fondo prima di prendere qualsiasi decisione sulla scansione completa della tabella

Di seguito sono riportati alcuni degli elementi da controllare
(a) Statistiche obsolete dell'ottimizzatore:controlla se le statistiche dell'ottimizzatore disponibili nelle tabelle sono aggiornate e non differiscono molto dai dati effettivi
(b) controlla gli indici e l'indice fattore di clustering :potrebbero mancare gli indici corretti
(c) La query potrebbe utilizzare la clausola parallela e quindi scegliere Scansione completa della tabella come piano ottimale
(d) Impostazioni dei parametri errate per Optimizer_mode,optimizer_index_cost_adj, Optimizer_index_caching

A volte l'esecuzione di sql tuning advisor sulla query aiuta

Articoli correlati
spiegare il piano in Oracle:tutto su Spiegare il piano in Oracle, come leggere Oracle spiegare il piano per problemi relativi alle prestazioni, come trovare il piano di spiegazione per la query nel cursore
cosa viene letto logico in Oracle:cos'è lettura logica in Oracle e I/O fisico in Oracle,Che è migliore I/O logico e fisico in termini di prestazioni,Query per trovare letture fisiche
sql tuning advisor:come eseguire sql tuning advisor per sql_id nel cursore cache, come viene creata ed eseguita l'attività di ottimizzazione sql per ottenere la raccomandazione
trova gli indici su una tabella in Oracle:consulta questo articolo per trovare query su come trovare gli indici su una tabella in Oracle, elenca tutti gli indici nello schema ,stato dell'indice, colonna dell'indice
bind variabili in Oracle :le variabili Bind sono il segnaposto per i valori in sqlplus e PLSQL e viene sostituito con valori quando l'istruzione viene eseguita
come controllare il profilo sql in Oracle :Check fuori questo post su come controllare il profilo sql in Oracle, come trovare il contenuto di sql prof ile, come eliminare il profilo sql