Helpex - Trao đổi & giúp đỡ Đăng nhập
10

Tôi có một truy vấn đang chạy trong cơ sở dữ liệu quan hệ không đáp ứng được mong đợi của người dùng.

Tôi nên cung cấp thông tin gì và tôi nên tránh những gì để tôi có thể nhận được sự trợ giúp hiệu quả trên trang web này?

10 hữu ích 2 bình luận 1.8k xem chia sẻ
14

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

Mô tả các triệu chứng của vấn đề

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 một 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 các vấn đề 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ả đầy đủ (không chỉ bảng với kế hoạch thực hiện). Cực kỳ quan trọng có thể là phần vị ngữ và các ghi chú bên dưới.

Ví dụ như 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 / DUAL@SEL$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 của 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 sự đượ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 khiến kế hoạch thực hiện được giải thích 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ể trích xuất kế hoạch từ bộ đệm ẩn DB cung cấp a 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 trong bộ nhớ cache) 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ếu thống kê trình tối ưu hóa được thu thập gần đây và hiển thị dbms_statscâu lệnh tập hợp đã sử dụng .

Đố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 kết hợp 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 bố đều hay lệch không (ví dụ một số lượng nhỏ các giá trị thường xuyên xảy ra và một số lượng lớn các giá trị hiếm). Bạn có xác định biểu đồ không?

Còn gì nữa 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ư số liệu thống kê hệ thống hoặc trình tối ưu hóa. Nhưng một lần nữa hãy cố gắng cung cấp thông tin tối thiểu mà (bạn là điều) có thể xác định được vấn đề. Đăng thông tin bổ sung khi có yêu cầu.

Chúc may mắn!

14 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ oracle performance relational-database query-optimization , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading