Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да опиша проблема с производителността в релационна база данни?

За база данни на Oracle предоставете тази информация:

Опишете симптомите на проблема

Опишете поведението, което причинява проблема. Стабилно ли е поведението на заявката или проблемът се появява само понякога, със специфични параметри или просто произволно. Можете ли да възпроизведете това поведение в IDE (напр. SQL Developer)?

Опишете средата

Определете точната версия на Oracle

 select * from v$version

Опишете как се свързвате с базата данни:драйвер, ORM, език за програмиране. Посочете имена и/или номера на версиите.

Опишете заявката

Публикувайте текста на заявката. Опитайте се да опростите - покажете минимално възпроизводим пример .

Пример - проблемната ви заявка обединява 10 таблици. Проверете дали виждате същите симптоми в заявка с 9 или 8 присъединявания. Отстъпете надолу, докато не видите проблемите и покажете само намалената заявка.

Да, това е скъпо, но значително увеличава шанса да получите подкрепа! Колкото по-малка е заявката, толкова по-силно привлича поддръжниците.

Опишете плана за изпълнение

За да получите плана за изпълнение, изпълнете този оператор (заменете текста на заявката си)

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

Планът за изпълнение се съхранява в PLAN_TABLE , за да го видите, изпълнете тази заявка

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

Покажете пълния резултат (не само таблицата с плана за изпълнение). Изключително важни може да са предикатният раздел и бележките по-долу.

Пример за 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]

Не изрязвайте и поставяйте графичния резултат на вашия план за обяснение на IDE.

Този план за изпълнение ли е истинският, който се изпълнява?

За съжаление не винаги. Има няколко обяснени причини планът за изпълнение може да се различава от реалния.

Ако се съмнявате (особено когато видите добър план, но заявката работи лошо), можете да извлечете плана от кеша на DB, като предоставите SQL_ID .

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

SQL_ID за заявка, която се изпълнява в момента (или се изпълняваше скоро и все още е кеширана) може да бъде намерен с текстово съвпадение и/или потребител на базата данни:

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

Ако имате лиценз AWR, можете да получите плана за изпълнение от там, дори за заявки, изпълнявани в историята.

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

SQL_ID може да бъде намерен с помощта на

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

Опишете данните

Покажете DDL на таблиците и индексите на тези таблици.

Посочете дали статистическите данни на оптимизатора са събрани наскоро и покажете използваните dbms_stats събиране на изявление.

За критичната(ите) таблица(и) предоставете информация за размера на сегмента, номера на редовете, разделянето,...

За колоните, използвани при достъп или присъединяване, предоставят информация за броя на отделните стойности. Стойностите са равномерно разпределени или изкривени (например малък брой стойности, които се срещат много често и голям брой редки стойности). Дефинирате ли хистограми?

Нещо друго?

Разбира се, това е само основното и все още може да се изисква друга информация, като системна статистика или параметри на оптимизатора. Но още веднъж се опитайте да предоставите минималната информация, която (вие) може да идентифицира проблема. Публикувайте допълнителна информация при поискване.

Късмет!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Database Developer Choice Awards

  2. PL/SQL колекция:Вложена таблица в базата данни на Oracle

  3. SQLT и разделяне

  4. Хибернация> CLOB> Oracle :(

  5. Алтернатива, независима от версията на Oracle ODP.NET