Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie, aby znaleźć pełne skany tabeli w Oracle

Wiele razy wydajność bazy danych będzie niska. Najpierw musimy dowiedzieć się, czy trwa skanowanie pełnej tabeli dużej tabeli.

Najpierw sprawdźmy, co to jest Pełne skanowanie tabeli, a następnie zobaczymy zapytanie, aby znaleźć pełne skanowanie tabeli w Oracle

Co to jest skanowanie całej tabeli

  • Pełne skanowanie tabeli jest jedną z metod dostępu używanych przez Optymalizator. W tym przypadku skanowane są wszystkie bloki w tabeli (aż do HWM), stosowane są warunki filtrowania klauzuli WHERE i zwracane są wiersze spełniające warunek filtrowania. Wyjaśnij plan pokaże się w ten sposób
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
  • Pełne skanowanie tabeli przeskanowało tabelę przy użyciu odczytu wielu bloków. Wiele bloków skanowanych dla każdego IO -> wykonywanych jest mniej operacji IO
  • Parametr db_multiblock_read_count init.ora decyduje o liczbie multibloków. Najnowsza wersja, sama Oracle dostosowuje ten parametr zgodnie z systemem i nie musisz go definiować
  • Co to jest HWM – High Water Mark:Jest to limit oddzielający bloki zawierające lub zawierające dane od bloków, które nigdy nie zostały wstawione. Liczbę bloków poniżej HWM można uzyskać w kolumnie bloków widoku dba_tables

zapytanie, aby znaleźć pełne skany tabel w 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
/

Powyższe zapytanie zgłosi bieżące pełne skanowanie tabeli w bazie danych. Możesz znaleźć nazwę tabeli z poniższego zapytania

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

Jeśli chcesz zobaczyć historię wszystkich bieżących sesji w bazie danych w celu pełnego skanowania tabeli, możemy użyć poniższego zapytania

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
/

Jeśli chcesz znaleźć całą pamięć podręczną sql w pamięci podręcznej biblioteki dla instrukcji pełnego skanowania tabeli

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

Możesz uzyskać pełny tekst z sql_id za pomocą poniższego zapytania

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

Jak uniknąć pełnego skanowania tabeli w Oracle

Pełne skanowanie tabeli nie jest złem koniecznym. Optymalizator Oracle wybiera plan na podstawie punktu danych. Jeśli wybrał pełne skanowanie danych, to z pewnością uznał to za dobre. Również dość często skanowanie indeksu może nie być dobre dla zapytania i jest bardziej kosztowne niż pełne skanowanie tabeli. Dlatego musimy dokładnie przeanalizować przed podjęciem jakiejkolwiek decyzji dotyczącej pełnego skanowania stołu

Oto niektóre z rzeczy do sprawdzenia
(a) Nieaktualne statystyki Optymalizatora:Sprawdź, czy statystyki optymalizatora dostępne w tabelach są aktualne i nie różnią się zbytnio od rzeczywistych danych
(b) Sprawdź indeksy i indeks współczynnik klastrowania :może brakować właściwych indeksów
(c) Zapytanie może używać klauzuli równoległej i dlatego wybiera pełne skanowanie tabeli jako optymalny plan
(d) Nieprawidłowe ustawienia parametrów dla Optimizer_mode,optimizer_index_cost_adj,Optimizer_index_caching

Czasami pomaga w zapytaniu uruchomienie doradcy dostrajania sql

Powiązane artykuły
plan wyjaśniania w Oracle :Wszystko o planie wyjaśniania w Oracle, Jak czytać plan wyjaśniania Oracle dla kwestii związanych z wydajnością, jak znaleźć plan wyjaśniania dla zapytania w kursorze
co to jest odczyt logiczny w Oracle :co to jest odczyt logiczny w Oracle i fizyczne we/wy w Oracle, co jest lepszym logicznym i fizycznym we/wy pod względem wydajności, zapytania w celu znalezienia fizycznych odczytów
doradca dostrajania sql:jak uruchomić doradcę dostrajania sql dla sql_id w kursorze pamięć podręczna, w jaki sposób tworzone i wykonywane jest zadanie strojenia sql, aby uzyskać rekomendację
znajdź indeksy w tabeli w oracle :zapoznaj się z tym artykułem, aby znaleźć zapytania dotyczące wyszukiwania indeksów w tabeli w oracle, wyświetl wszystkie indeksy w schemacie ,stan indeksu, kolumna indeksu
zmienne wiązania w oracle :Zmienne wiązania są symbolem zastępczym dla wartości w sqlplus i PLSQL i są zastępowane wartościami podczas wykonywania instrukcji
jak sprawdzić profil sql w oracle :Sprawdź opublikować ten post o tym, jak sprawdzić profil sql w Oracle, jak znaleźć zawartość sql prof jak usunąć profil sql


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykład Oracle Dynamic SQL do wstawiania rekordu przy użyciu DBMS_SQL

  2. REGEXP_COUNT() Funkcja w Oracle

  3. Zamek Liquibase - powody?

  4. Znajdowanie i usuwanie znaków spoza zestawu ASCII z Oracle Varchar2

  5. Jak zwrócić wiele wierszy z procedury składowanej? (PL/SQL Oracle)