sql >> Databasteknik >  >> RDS >> Oracle

Fråga för att hitta genomsökningar av hela tabellen i Oracle

Många gånger blir databasens prestanda långsam. Vi måste först ta reda på  om någon genomsökning av hela tabellen pågår.

Låt oss först kolla in vad som är Full table scan och sedan kommer vi att se frågan för att hitta full table scans i Oracle

Vad är Full table Scan

  • Fullständig tabellsökning är en av åtkomstmetoderna som används av Optimizer. I detta skannas alla block i tabellen (upp till HWM) och filtervillkoren för WHERE-satsen tillämpas och rader som uppfyllde filtervillkoret returneras. Förklara planen kommer att visas så här
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
  • Fullständig tabellskanning skannade tabellen med flera blockläsningar. Flera block skannade för varje IO –> färre IO-operationer görs
  • db_multiblock_read_count init.ora-parametern bestämmer antalet flerblock. Senaste versionen, Oracle själv justerar denna parameter enligt systemet och du behöver inte definiera den
  • Vad är HWM – High Water Mark :Det är gränsen som skiljer blocken som innehåller eller har innehållit data från blocken som aldrig har infogats i. Antalet block under HWM kan erhållas genom blockkolumnen i dba_tables-vyn

fråga för att hitta genomsökningar av hela tabeller 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
/

Ovanstående fråga kommer att rapportera alla aktuella fullständiga tabellsökningar som pågår i databasen. Du kan hitta tabellnamnet från frågan nedan

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

Om du vill se historiken för alla aktuella sessioner i databasen för fullständig tabellskanning kan vi använda frågan nedan

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
/

Om du vill hitta all sql som är cachad i Bibliotekets cache för Full table scan statement

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

Du kan hämta hela texten från sql_id genom att använda frågan nedan

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

Hur man undviker fullbordssökning i Oracle

Full tabell scan är inte nödvändigt ont. Oracle Optimizer väljer planen baserat på datapunkt. Om den har valt full data scan, så har den verkligen funnit det bra. Också ganska ofta kanske indexskanning inte är bra för frågan och det är dyrast än fullbordsskanning. Så vi måste analysera noggrant innan vi fattar något beslut om fullbordsskanning

Följande är några saker att kontrollera
(a) Stale Optimizer-statistik:Kontrollera om optimeringsstatistiken som finns tillgänglig i tabellerna är aktuell och inte skiljer sig mycket från faktiska data
(b) Kontrollera index och index klustringsfaktor :Du kanske saknar rätt index
(c) Frågan kanske använder parallellklausul och väljer därför Fullständig tabellsökning som optimal plan
(d) Felaktiga parameterinställningar för Optimizer_mode,optimizer_index_cost_adj, optimizer_index_caching

Ibland hjälper det att köra sql tuning rådgivare på frågan

Relaterade artiklar
förklara plan i Oracle :Allt om Förklara plan i Oracle, Hur man läser oracle förklara plan för prestationsrelaterad fråga, hur man hittar förklara planen för fråga i markören
vad är logiskt läst i Oracle :vad är logisk läsning i oracle och fysisk I/O i Oracle, Vilket är bättre logiskt och fysiskt I/O när det gäller prestanda, frågor för att hitta fysiska läsningar
sql tuning advisor :Hur man kör sql tuning advisor för sql_id i markören cache, hur skapas och körs sql-inställningsuppgiften för att få rekommendationen
hitta index på en tabell i Oracle:kolla in den här artikeln för att hitta frågor om hur man hittar index på en tabell i Oracle, lista alla index i schemat ,indexstatus, indexkolumn
bindningsvariabler i Oracle :Bindvariabler är platshållare för värden i sqlplus och PLSQL och den ersätts med värden när satsen körs
hur man kontrollerar sql-profilen i Oracle :Kontrollera ut det här inlägget om hur man kontrollerar sql-profilen i Oracle, hur man hittar innehållet i sql prof ile, hur man släpper sql-profilen


  1. Befolkar trädobjekt med rekordgrupp i Oracle-formulär

  2. MySQL beviljar privilegier till användare för databas

  3. SQL Server 2016:Infoga data

  4. Använda SQL Views för att lägga till/redigera data i Microsoft Access