Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để mô tả vấn đề hiệu suất trong cơ sở dữ liệu quan hệ?

Đối với Cơ sở dữ liệu Oracle cung cấp thông tin này:

Mô tả các triệu chứng của sự cố

Mô tả hành vi gây ra vấn đề. Hoạt động của truy vấn có ổn định không hay sự cố chỉ xảy ra đôi khi, với các tham số cụ thể hoặc ngẫu nhiên đơn giản. Bạn có thể tái tạo hành vi này trong IDE (ví dụ:Nhà phát triển SQL) không?

Mô tả môi trường

Xác định phiên bản chính xác của Oracle

 select * from v$version

Mô tả cách bạn kết nối với cơ sở dữ liệu:trình điều khiển, ORM, ngôn ngữ lập trình. Cung cấp tên và / hoặc số phiên bản.

Mô tả truy vấn

Đăng văn bản truy vấn. Cố gắng đơn giản hóa - hiển thị một ví dụ có thể tái tạo tối thiểu .

Ví dụ - bạn có vấn đề truy vấn kết hợp 10 bảng. Kiểm tra xem bạn có thấy các triệu chứng tương tự trong một truy vấn có 9 hoặc 8 phép nối hay không. Bước xuống cho đến khi bạn thấy sự cố và chỉ hiển thị truy vấn đã giảm.

Có, điều này tốn kém, nhưng nó làm tăng cơ hội bạn nhận được hỗ trợ! Truy vấn càng nhỏ thì càng thu hút được nhiều người ủng hộ.

Mô tả kế hoạch thực hiện

Để có được kế hoạch thực thi, hãy chạy câu lệnh này (thay thế văn bản truy vấn của bạn)

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

Kế hoạch thực thi được lưu trữ trong PLAN_TABLE , để xem nó chạy truy vấn này

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

Hiển thị kết quả hoàn chỉnh (không chỉ bảng với kế hoạch thực hiện). Phần bổ sung quan trọng có thể là phần vị ngữ và phần ghi chú bên dưới.

Ví dụ cho 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]

Không cắt và dán kết quả đồ họa về kế hoạch giải thích IDE của bạn.

Kế hoạch thực thi này có phải là kế hoạch thực được thực hiện không?

Thật không may là không phải luôn luôn như vậy. Có một số lý do được giải thích kế hoạch thực hiện có thể khác với kế hoạch thực.

Nếu bạn nghi ngờ (đặc biệt là khi bạn thấy một kế hoạch tốt, nhưng truy vấn chạy không tốt), bạn có thể tách kế hoạch khỏi bộ đệm ẩn DB cung cấp SQL_ID .

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

Có thể tìm thấy SQL_ID cho truy vấn hiện đang chạy (hoặc đang chạy trong thời gian ngắn và vẫn được lưu vào bộ nhớ đệm) với đối sánh văn bản và / hoặc người dùng cơ sở dữ liệu:

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

Nếu bạn có giấy phép AWR, bạn có thể nhận được kế hoạch thực thi từ đó, ngay cả đối với các truy vấn đang chạy trong lịch sử.

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

SQL_ID có thể được tìm thấy bằng cách sử dụng

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

Mô tả dữ liệu

Hiển thị DDL của các bảng và chỉ mục trên các bảng đó.

Đề cập đến nếu gần đây thống kê trình tối ưu hóa được thu thập và hiển thị dbms_stats đã sử dụng thu thập tuyên bố.

Đối với (các) bảng quan trọng, hãy cung cấp thông tin về kích thước phân đoạn, số hàng, phân vùng, ...

Đối với các cột được sử dụng trong truy cập hoặc liên kết cung cấp thông tin về số lượng các giá trị riêng biệt. Các giá trị có được phân phối đồng đều hay lệch (ví dụ:một số lượng nhỏ các giá trị thường xuyên xảy ra và một số lớn các giá trị hiếm gặp). Bạn có xác định biểu đồ không?

Còn gì khác không?

Tất nhiên đây chỉ là thông tin cơ bản và các thông tin khác vẫn có thể được yêu cầu, chẳng hạn như thống kê hệ thống hoặc các thông số của trình tối ưu hóa. P>

Chúc may mắn!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng kép trong Oracle là gì?

  2. SQL - Tìm các giá trị int bị thiếu trong chuỗi tuần tự được sắp xếp chủ yếu

  3. Tại sao DECODE của Oracle lại cho tôi một giá trị khác với NVL?

  4. Mệnh đề Oracle SQL Where để tìm các bản ghi ngày cũ hơn 30 ngày

  5. SQL nhiều cột trong mệnh đề IN