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

Jak opisać problem wydajności w relacyjnej bazie danych?

Baza danych Oracle podaj te informacje:

Opisz objawy problemu

Opisz zachowanie, które powoduje problem. Czy zachowanie zapytania jest stabilne, czy problem występuje tylko czasami, z określonymi parametrami lub po prostu losowo. Czy możesz odtworzyć to zachowanie w IDE (np. SQL Developer)?

Opisz środowisko

Zdefiniuj dokładną wersję Oracle

 select * from v$version

Opisz jak łączysz się z bazą danych:sterownik, ORM, język programowania. Podaj nazwy i/lub numery wersji.

Opisz zapytanie

Opublikuj tekst zapytania. Spróbuj uprościć – pokaż minimalny powtarzalny przykład .

Przykład - problematyczne zapytanie łączy 10 tabel. Sprawdź, czy widzisz te same symptomy w zapytaniu z 9 lub 8 sprzężeniami. Zejdź w dół, aż zobaczysz problemy i pokaż tylko zredukowane zapytanie.

Tak, to jest kosztowne, ale znacznie zwiększa szansę na otrzymanie wsparcia! Im mniejsze zapytanie, tym bardziej przyciąga zwolenników.

Opisz plan wykonania

Aby uzyskać plan wykonania, uruchom tę instrukcję (zastąp tekst zapytania)

 EXPLAIN PLAN  SET STATEMENT_ID = '<some_id>' into   plan_table  FOR
     select * from ....   -- your query here 
 ;

Plan wykonania jest przechowywany w PLAN_TABLE , aby zobaczyć, uruchom to zapytanie

 SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL')); 

Pokaż pełny wynik (nie tylko tabela z planem wykonania). Niezwykle ważna może być sekcja predykatu i poniższe uwagi.

Przykład dla select * from dual where dummy = :1;

Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / [email protected]$1

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("DUMMY"=:1)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "DUMMY"[VARCHAR2,1]

Nie wycinaj i nie wklejaj wyniku graficznego planu wyjaśnień IDE.

Czy ten plan wykonania jest prawdziwym planem, który jest wykonywany?

Niestety nie zawsze. Istnieje kilka powodów, dla których wyjaśniono plan wykonania może różnić się od rzeczywistego.

Jeśli masz wątpliwości (zwłaszcza, gdy widzisz dobry plan, ale zapytanie działa źle) możesz wyodrębnić plan z pamięci podręcznej bazy danych, podając SQL_ID .

 SELECT t.* FROM  table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 

SQL_ID dla zapytania, które jest aktualnie uruchomione (lub działało krótko i nadal jest zapisane w pamięci podręcznej) można znaleźć za pomocą dopasowania tekstu i/lub użytkownika bazy danych:

select sql_id, sql_fulltext from v$sql a where 
 lower(sql_text) like lower('%<some identifying part of the query text>%') 
  and parsing_schema_name = '<user running the query>';

Jeśli masz licencję AWR, możesz uzyskać stamtąd plan wykonania, nawet dla zapytań uruchomionych w historii.

SELECT t.*
FROM  table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k'  )) t;

SQL_ID można znaleźć za pomocą

select sql_id, sql_text 
from dba_hist_sqltext a 
where lower(sql_text) like lower('%<some identifying part of the query text>%')

Opisz dane

Pokaż DDL tabel i indeksów w tych tabelach.

Wspomnij, czy statystyki optymalizatora zostały ostatnio zebrane i pokaż używane dbms_stats zbierz oświadczenie.

W przypadku tabel krytycznych podaj informacje o rozmiarze segmentu, numerze wiersza, partycjonowaniu,...

Dla kolumn używanych w dostępie lub złączeniach podaj informację o liczbie odrębnych wartości. Czy wartości są równomiernie rozłożone, czy przekrzywione (np. mała liczba wartości, która występuje bardzo często i duża liczba wartości rzadkich). Czy definiujesz histogramy?

Czy coś jeszcze?

Oczywiście są to tylko podstawy i nadal mogą być wymagane inne informacje, takie jak statystyki systemu lub parametry optymalizatora. Ale jeszcze raz spróbuj podać minimum informacji, które (coś) mogą zidentyfikować problem. Opublikuj dodatkowe informacje na żądanie.

Powodzenia!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy ODP.NET wymaga instalacji klienta Oracle?

  2. Odwoływanie się do typów zdefiniowanych przez użytkownika Oracle przez DBLINK?

  3. Jak napisać zapytanie, które robi coś podobnego do GROUP_CONCAT MySQL w Oracle?

  4. Zaktualizuj instrukcję z wewnętrznym sprzężeniem w Oracle

  5. Jak znaleźć zduplikowane kolejne wartości w tej tabeli?