Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana menggambarkan masalah kinerja dalam database relasional?

Untuk Database Oracle berikan informasi ini:

Jelaskan gejala masalah

Jelaskan perilaku yang menyebabkan masalah. Apakah perilaku kueri stabil atau masalah hanya terjadi kadang-kadang, dengan parameter tertentu atau acak sederhana. Bisakah Anda mereproduksi perilaku ini dalam IDE (mis. Pengembang SQL)?

Jelaskan lingkungan

Tentukan versi persis dari Oracle

 select * from v$version

Jelaskan bagaimana Anda terhubung ke database:driver, ORM, bahasa pemrograman. Berikan nama dan/atau nomor versi.

Jelaskan kueri

Posting teks kueri. Coba sederhanakan - tunjukkan contoh minimal yang dapat direproduksi .

Contoh - kueri Anda yang bermasalah bergabung dengan 10 tabel. Periksa apakah Anda melihat gejala yang sama dalam kueri dengan 9 atau 8 gabungan. Mundur hingga Anda melihat masalah dan hanya tampilkan kueri yang dikurangi.

Ya, ini mahal, tetapi sangat meningkatkan kemungkinan Anda menerima dukungan! Semakin kecil kuerinya, semakin tinggi daya tariknya bagi para pendukung.

Jelaskan rencana eksekusi

Untuk mendapatkan rencana eksekusi, jalankan pernyataan ini (ganti teks kueri Anda)

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

Rencana eksekusi disimpan di PLAN_TABLE , untuk melihatnya jalankan kueri ini

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

Tampilkan hasil lengkap (tidak hanya tabel dengan rencana eksekusi). Sangat penting mungkin bagian predikat dan catatan di bawah.

Contoh untuk 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]

Jangan memotong dan menempelkan hasil grafis dari rencana penjelasan IDE Anda.

Apakah rencana eksekusi ini benar-benar dijalankan?

Sayangnya tidak selalu. Ada beberapa alasan yang dijelaskan rencana eksekusi mungkin berbeda dari yang sebenarnya.

Jika Anda ragu (terutama ketika Anda melihat paket yang bagus, tetapi kuerinya berjalan buruk), Anda dapat mengekstrak paket tersebut dari cache DB dengan memberikan SQL_ID .

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

SQL_ID untuk kueri yang sedang berjalan (atau sedang berjalan segera dan masih di-cache) dapat ditemukan dengan kecocokan teks dan/atau pengguna database:

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

Jika Anda memiliki lisensi AWR, Anda mungkin mendapatkan rencana eksekusi dari sana, bahkan untuk kueri yang berjalan dalam riwayat.

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

SQL_ID dapat ditemukan menggunakan

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

Jelaskan datanya

Tunjukkan DDL dari tabel dan indeks pada tabel tersebut.

Sebutkan jika statistik pengoptimal dikumpulkan baru-baru ini dan tunjukkan dbms_stats yang digunakan mengumpulkan pernyataan.

Untuk tabel kritis, berikan informasi tentang ukuran segmen, nomor baris, partisi,...

Untuk kolom yang digunakan dalam akses atau gabungan memberikan informasi tentang jumlah nilai yang berbeda. Apakah nilai terdistribusi merata atau miring (misalnya sejumlah kecil nilai yang sering muncul dan sejumlah besar nilai langka). Apakah Anda mendefinisikan histogram?

Ada Lagi?

Tentu saja ini hanya dasar-dasarnya dan informasi lain mungkin masih diperlukan, seperti statistik sistem atau parameter pengoptimal. Tetapi sekali lagi coba berikan informasi minimal yang (Anda) dapat mengidentifikasi masalahnya. Kirimkan informasi tambahan berdasarkan permintaan.

Semoga berhasil!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memeriksa statistik basi

  2. PL/SQL ORA-01422:pengambilan yang tepat mengembalikan lebih dari jumlah baris yang diminta

  3. menghapus milidetik dari bidang tmstmp Oracle

  4. Bagaimana cara meneruskan nilai ke operator IN secara dinamis?

  5. Cara menggunakan kunci asing di oracle