sql >> Databáze >  >> RDS >> Oracle

Jak popsat problém s výkonem v relační databázi?

Pro databázi Oracle poskytněte tyto informace:

Popište příznaky problému

Popište chování, které způsobuje problém. Je chování dotazu stabilní nebo se problém vyskytuje pouze někdy, se specifickými parametry nebo jednoduše náhodně. Můžete toto chování reprodukovat v IDE (např. SQL Developer)?

Popište prostředí

Definujte přesnou verzi Oracle

 select * from v$version

Popište, jak se připojujete k databázi:ovladač, ORM, programovací jazyk. Zadejte názvy a/nebo čísla verzí.

Popište dotaz

Zveřejněte text dotazu. Zkuste to zjednodušit – ukažte minimální reprodukovatelný příklad .

Příklad - váš problematický dotaz spojuje 10 tabulek. Zkontrolujte, zda vidíte stejné příznaky v dotazu s 9 nebo 8 spojeními. Odstupte, dokud neuvidíte problémy, a zobrazte pouze omezený dotaz.

Ano, je to nákladné, ale výrazně to zvyšuje šanci, že podporu získáte! Čím menší je dotaz, tím více přitahuje příznivce.

Popište plán provádění

Chcete-li získat plán provádění, spusťte tento příkaz (nahraďte text dotazu)

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

Prováděcí plán je uložen v PLAN_TABLE , abyste viděli, že spouští tento dotaz

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

Zobrazit úplný výsledek (nejen tabulka s prováděcím plánem). Mimořádně důležitá může být sekce predikátů a poznámky níže.

Příklad pro 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]

Nevystřihujte a nevkládejte grafický výsledek vašeho plánu vysvětlení IDE.

Je tento plán provádění skutečný plán, který se provádí?

Bohužel ne vždy. Důvodů vysvětlených je několik plán provádění se může lišit od skutečného.

Pokud máte pochybnosti (zejména když vidíte dobrý plán, ale dotaz běží špatně), můžete extrahovat plán z mezipaměti DB poskytnutím SQL_ID .

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

SQL_ID pro dotaz, který je aktuálně spuštěn (nebo byl spuštěn krátce a je stále uložen v mezipaměti), lze nalézt pomocí shody textu a/nebo uživatele databáze:

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>';

Pokud máte licenci AWR, můžete odtud získat plán provádění, a to i pro dotazy spuštěné v historii.

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

SQL_ID lze nalézt pomocí

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

Popište data

Zobrazit DDL tabulek a indexů v těchto tabulkách.

Uveďte, zda se statistiky optimalizátoru shromažďují nedávno, a ukažte použité dbms_stats shromáždit prohlášení.

U kritických tabulek uveďte informace o velikosti segmentu, čísle řádku, rozdělení,...

Pro sloupce používané v přístupu nebo spojení poskytněte informace o počtu různých hodnot. Jsou hodnoty rovnoměrně rozloženy nebo zkreslené (např. malý počet hodnot, které se vyskytují velmi často, a velký počet vzácných hodnot). Definujete histogramy?

Ještě něco?

Toto jsou samozřejmě pouze základní informace a stále mohou být vyžadovány další informace, jako jsou systémové statistiky nebo parametry optimalizátoru. Ale ještě jednou se pokuste poskytnout minimální informace, které (vy, co) můžete identifikovat problém. Na požádání zveřejněte další informace.

Hodně štěstí!




  1. Jak mohu pracovat s vysoce přesnými desetinnými místy v PHP

  2. Jaký je rozdíl mezi použitím INDEX vs KEY v MySQL?

  3. Použití klauzule EXCEPT v PostgreSQL

  4. Základy správy datových souborů na SQL Serveru