Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abfrage, um vollständige Tabellenscans in Oracle zu finden

Oft wird die Leistung der Datenbank langsam sein. Wir müssen zuerst herausfinden, ob ein Full-Table-Scan für große Tabellen im Gange ist.

Schauen wir uns zuerst an, was Full Table Scan ist, und dann sehen wir uns die Abfrage an, um Full Table Scans in Oracle zu finden

Was ist Full Table Scan

  • Full Table Scan ist eine der von Optimizer verwendeten Zugriffsmethoden. Dabei werden alle Blöcke in der Tabelle (bis HWM) gescannt und die Filterbedingungen der WHERE-Klausel angewendet und Zeilen zurückgegeben, die die Filterbedingung erfüllt haben. Plan erklären wird so angezeigt
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
  • Full Table Scan scannte die Tabelle unter Verwendung mehrerer Blocklesevorgänge. Mehrere Blöcke wurden für jeden IO gescannt –> es werden weniger IO-Operationen durchgeführt
  • db_multiblock_read_count init.ora Parameter bestimmen die Multiblock-Anzahl. Neuere Version, Oracle selbst passt diesen Parameter gemäß dem System an und Sie müssen ihn nicht definieren
  • Was ist HWM – High Water Mark:Es ist die Grenze, die die Blöcke, die Daten enthalten oder enthalten haben, von den Blöcken trennt, in die noch nie eingefügt wurde. Die Anzahl der Blöcke unterhalb des HWM kann über die Blocks-Spalte der dba_tables-Ansicht
  • abgerufen werden

Abfrage, um vollständige Tabellenscans in Oracle zu finden

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
/

Die obige Abfrage meldet jeden aktuellen vollständigen Tabellenscan, der in die Datenbank geht. Den Tabellennamen finden Sie in der folgenden Abfrage

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

Wenn Sie den Verlauf aller aktuellen Sitzungen in der Datenbank für einen vollständigen Tabellenscan sehen möchten, können wir die folgende Abfrage verwenden

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
/

Wenn Sie alle im Bibliothekscache zwischengespeicherten SQL-Anweisungen für die vollständige Tabellenscan-Anweisung finden möchten

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

Sie können den vollständigen Text von sql_id mit der folgenden Abfrage abrufen

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

Wie man einen vollständigen Tabellenscan in Oracle vermeidet

Full Table Scan ist kein notwendiges Übel. Der Oracle-Optimierer wählt den Plan basierend auf dem Datenpunkt aus. Wenn man sich für Full Data Scan entschieden hat, dann hat man es sicher gut gefunden. Außerdem ist der Indexscan häufig nicht gut für die Abfrage und am kostspieligsten als der vollständige Tabellenscan. Daher müssen wir gründlich analysieren, bevor wir eine Entscheidung über einen vollständigen Tabellenscan treffen

Im Folgenden sind einige Dinge zu überprüfen
(a) Veraltete Optimierer-Statistiken:Bitte prüfen Sie, ob die in den Tabellen verfügbaren Optimierer-Statistiken aktuell sind und sich nicht stark von den tatsächlichen Daten unterscheiden
(b) Indizes und Index prüfen Clustering-Faktor:Möglicherweise fehlen Ihnen die richtigen Indizes
(c) Die Abfrage verwendet möglicherweise eine Parallelklausel und wählt daher Full Table Scan als optimalen Plan
(d) Falsche Parametereinstellungen für Optimizer_mode, Optimizer_index_cost_adj, Optimizer_index_caching

Manchmal hilft es, den SQL Tuning Advisor für die Abfrage auszuführen

Verwandte Artikel
Explain Plan in Oracle:Alles über Explain Plan in Oracle, Wie man Oracle Explain Plan für leistungsbezogene Probleme liest, wie man den Explain Plan für Abfragen im Cursor findet
was in Oracle logisch gelesen wird:was ist logischer Lesevorgang in Oracle und physischer I/O in Oracle, was in Bezug auf die Leistung bessere logische und physische I/O ist, Abfragen, um physische Lesevorgänge zu finden
SQL Tuning Advisor :So führen Sie den SQL Tuning Advisor für sql_id im Cursor aus Cache, wie wird die SQL-Optimierungsaufgabe erstellt und ausgeführt, um die Empfehlung zu erhalten
Indizes für eine Tabelle in Oracle finden:In diesem Artikel finden Sie Abfragen zum Suchen von Indizes für eine Tabelle in Oracle, listen alle Indizes im Schema auf , Indexstatus, Indexspalte
Bind-Variablen in Oracle:Bind-Variablen sind der Platzhalter für Werte in SQLPlus und PLSQL und werden durch Werte ersetzt, wenn die Anweisung ausgeführt wird
So überprüfen Sie das SQL-Profil in Oracle:Check Lesen Sie diesen Beitrag darüber, wie Sie das SQL-Profil in Oracle überprüfen, wie Sie den Inhalt von SQL Prof finden ile, wie man das SQL-Profil löscht