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