sql >> Databasteknik >  >> RDS >> Oracle

Hur kan man beskriva prestandaproblem i relationsdatabas?

För Oracle Database ge denna information:

Beskriv symptomen på problemet

Beskriv beteendet som orsakar problemet. Är frågans beteende stabilt eller uppstår problemet bara ibland, med specifika parametrar eller helt enkelt slumpmässigt. Kan du återskapa detta beteende i en IDE (t.ex. SQL-utvecklare)?

Beskriv miljön

Definiera den exakta versionen av Oracle

 select * from v$version

Beskriv hur du ansluter till databasen:drivrutin, ORM, programmeringsspråk. Ange namn och/eller versionsnummer.

Beskriv frågan

Lägg upp frågetexten. Försök att förenkla - visa ett minimalt reproducerbart exempel .

Exempel - din problematiska fråga sammanfogar 10 tabeller. Kontrollera om du ser samma symptom i en fråga med 9 eller 8 joins. Kliv ner tills du ser problemen och visa bara den reducerade frågan.

Ja, det här är dyrt, men det ökar chansen att du får support! Ju mindre frågan är desto högre lockar den supportrarna.

Beskriv genomförandeplanen

För att få exekveringsplanen kör den här satsen (ersätt din frågetext)

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

Exekveringsplanen lagras i PLAN_TABLE , för att se den kör den här frågan

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

Visa det fullständiga resultatet (inte bara tabellen med utförandeplanen). Extremt viktigt kan vara predikatsektionen och anteckningarna nedan.

Exempel för 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]

Klipp och klistra inte in det grafiska resultatet av din IDE förklara planen.

Är den här genomförandeplanen den verkliga som genomförs?

Tyvärr inte alltid. Det finns flera anledningar till att förklarade genomförandeplanen kan skilja sig från den verkliga.

Om du är tveksam (särskilt när du ser en bra plan, men frågan går dåligt) kan du extrahera planen från DB-cachen och tillhandahålla en SQL_ID .

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

SQL_ID för en fråga som körs för närvarande (eller kördes inom kort och fortfarande är cachad) kan hittas med textmatchning och/eller databasanvändaren:

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

Om du har AWR-licens kan du få exekveringsplanen därifrån, även för frågor som körs i historiken.

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

SQL_ID kan hittas med

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

Beskriv data

Visa DDL för tabellerna och indexen på dessa tabeller.

Nämn om optimeringsstatistiken har samlats in nyligen och visar använda dbms_stats samla uttalande.

För de kritiska tabellerna, tillhandahåll information om segmentstorlek, radnummer, partitionering,...

För kolumnerna som används i åtkomst eller kopplingar, ge information om antalet distinkta värden. Är värdena jämnt fördelade eller skeva (t.ex. ett litet antal värden som förekommer mycket ofta och ett stort antal sällsynta värden). Definierar du histogram?

Något annat?

Naturligtvis är detta bara grunderna och annan information kan fortfarande krävas, såsom systemstatistik eller optimeringsparametrar. Men försök återigen att tillhandahålla den minimala information som (du) kan identifiera problemet. Lägg upp ytterligare information på begäran.

Lycka till!




  1. Lagergenomsnittlig kostnadsberäkning i SQL

  2. SQL-transponera hela tabellen

  3. Övervakning av Percona Server för MySQL - nyckelmått

  4. Hur använder man Timestamp_to_scn och Scn_to_timestamp i Oracle?