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

Giới thiệu về auto_explain:Cách tự động ghi nhật ký các kế hoạch truy vấn Postgres chậm

Bạn có muốn biết tại sao truy vấn PostgreSQL lại chậm không? Khi đó GIẢI THÍCH PHÂN TÍCH là một điểm khởi đầu tuyệt vời. Nhưng kế hoạch truy vấn có thể phụ thuộc vào hoạt động khác của máy chủ, có thể mất một lúc để chạy và có thể thay đổi theo thời gian, vì vậy nếu bạn muốn xem kế hoạch thực thi thực tế của các truy vấn chậm nhất của mình, auto_explain là công cụ bạn cần. Trong bài đăng này, chúng tôi sẽ xem xét chức năng của nó, cách định cấu hình nó và cách sử dụng những nhật ký đó để tăng tốc các truy vấn của bạn.

auto_explain là gì?

auto_explain là một tiện ích mở rộng PostgreSQL cho phép bạn ghi lại các kế hoạch truy vấn cho các truy vấn chậm hơn ngưỡng (có thể định cấu hình). Điều này cực kỳ hữu ích để gỡ lỗi các truy vấn chậm, đặc biệt là những truy vấn đôi khi có vấn đề. Nó là một trong những mô-đun đóng góp, vì vậy có thể được cài đặt và định cấu hình dễ dàng trên PostgreSQL thông thường và rất hữu ích nên chúng tôi có nó theo mặc định trên ScaleGrid.

Xin chân thành cảm ơn Takahiro Itagaki, tác giả chính đằng sau phiên bản auto_explain (cam kết, chủ đề) đầu tiên, Dean Rasheed, người có bản vá và đề xuất ban đầu mà nó dựa trên, và rất nhiều những người đóng góp và đánh giá cho nó kể từ đó.

Tôi nên sử dụng thông số auto_explain nào?

Dưới đây chúng ta sẽ thảo luận về các thông số quan trọng nhất, nhưng vui lòng xem lại bảng bên dưới hoặc tài liệu chính thức để biết thêm thông tin về toàn bộ những thứ bạn có thể theo dõi.

Tham số quan trọng nhất cho auto_explain là log_min_duration . Theo mặc định, điều này được đặt thành -1 , có nghĩa là không có gì sẽ được ghi lại - vì vậy nếu chúng ta muốn một số nhật ký, chúng ta cần thay đổi nó! Đơn vị mặc định là ms, do đó, cài đặt 100 sẽ ghi lại các kế hoạch truy vấn cho tất cả các truy vấn vượt quá 100ms. Đây là những gì chúng tôi đã chọn làm mặc định trong ScaleGrid, nhưng nó có thể được định cấu hình trong Quản trị -> Cấu hình. Nếu vì lý do nào đó, bạn muốn ghi lại kế hoạch truy vấn cho mọi truy vấn, bạn có thể đặt giá trị này thành 0 - nhưng hãy cẩn thận, điều này có thể có tác động nghiêm trọng đến hiệu suất.

Vì các truy vấn đã được thực thi trên máy chủ, bạn có thể cũng muốn bật auto_explain.log_analyze . Điều này làm cho đầu ra tương đương với chạy EXPLAIN ANALYZE . Theo mặc định, điều đó cũng có nghĩa là thời gian cho mỗi hoạt động được theo dõi. Điều này đi kèm với một số chi phí bổ sung, có thể được giảm thiểu bằng cách tắt auto_explain.log_timing (được bật theo mặc định với log_analyze ). Đương nhiên, thời gian cho mỗi thao tác rất hữu ích khi gỡ lỗi các truy vấn chậm! Thử nghiệm nội bộ của chúng tôi cho thấy tổng chi phí có thể chấp nhận được cho việc này, do đó, nó được bật theo mặc định trong ScaleGrid, nhưng hãy kiểm tra khối lượng công việc của bạn để xem liệu chi phí có thể chấp nhận được trong trường hợp của bạn hay không. Hiện tại có rất ít thông tin công khai về chủ đề này, nhưng một bài đăng gần đây của nhóm pgMustard cho thấy rằng, ít nhất trên một khối lượng công việc giao dịch nhỏ, chi phí có thể thấp tới 2%. Như họ đã lưu ý, điều này có thể được giảm bớt với auto_explain.sample_rate , với chi phí chỉ theo dõi một tập hợp con các truy vấn của bạn.

Tham số cuối cùng mà chúng ta sẽ thảo luận chi tiết hơn là auto_explain.log_format . Đầu ra mặc định là TEXT, đây có thể là thứ bạn quen thuộc nhất khi sử dụng EXPLAIN .

Đây là một ví dụ đơn giản về đầu ra auto_explain ở định dạng TEXT có thể trông như thế nào:

 2021-09-10 15:32:04.606 BST [22770] LOG:time:3184.383 ms plan:Query Text:select * from table1 order by column1; Sắp xếp (chi phí =12875,92..13125,92 hàng =100000 chiều rộng =37) (thời gian thực =2703,799..3055,401 hàng =100000 vòng =1) Khóa sắp xếp:column1 Phương pháp sắp xếp:kết hợp bên ngoài Đĩa:4696kB Bộ đệm:lượt truy cập được chia sẻ =837, tạm thời read =587 write =589 -> Seq Scan on table (chi phí =0,00..1834,01 hàng =100000 chiều rộng =37) (thời gian thực =0,033..27,795 hàng =100000 vòng =1) Bộ đệm:lượt truy cập được chia sẻ =834  

Bạn có thể thấy ở đây rằng bạn nhận được thời lượng truy vấn ngay từ đầu, mà bạn có thể quen nhìn thấy ở cuối các kế hoạch truy vấn thường. Bạn cũng sẽ thấy văn bản truy vấn, bao gồm bất kỳ tham số nào.

Các công cụ trực quan hóa phổ biến giải thích.depesz và giải thích.dalibo đều chấp nhận các kế hoạch truy vấn ở định dạng TEXT, nhưng cả hai đều hỗ trợ định dạng JSON. Nếu một số người trong nhóm của bạn thích sử dụng các công cụ như PEV và pgMustard, chỉ hỗ trợ định dạng JSON, bạn có thể muốn đặt đó làm định dạng. Đối với khách hàng trên ScaleGrid, chúng tôi đã chọn định dạng JSON, một phần vì chúng tôi muốn phân tích cú pháp dễ dàng hơn cho tính năng phân tích truy vấn chậm của riêng chúng tôi.

Đây là danh sách đầy đủ các tham số auto_explain và các tham số mặc định của chúng:

Thông số Mặc định PostgreSQL Mặc định ScaleGrid
auto_explain.log_min_duration - 1 100
auto_explain.log_analyze Tắt Bật
auto_explain.log_timing Bật (với log_analyze) Bật
auto_explain.log_buffers Tắt Bật
auto_explain.log_verbose Tắt Bật
auto_explain.log_triggers Tắt Tắt
auto_explain.log_nested_statements Tắt Tắt
auto_explain.log_settings (v12) Tắt Tắt
auto_explain.log_wal (v13) Tắt Tắt
auto_explain.log_format VĂN BẢN JSON
auto_explain.log_level ĐĂNG NHẬP ĐĂNG NHẬP
auto_explain.sample_rate 1 1

Cài đặt auto_explain

Trên ScaleGrid, auto_explain được bật theo mặc định, với ngưỡng 100 mili giây. Bạn có thể định cấu hình điều này trong Quản trị -> Cấu hình.

Trên vanilla PostgreSQL, bạn có thể cài đặt auto_explain đơn giản bằng cách thêm nó vào một trong các session_preload_libraries hoặc shared_preload_libraries . Cái trước có ưu điểm là a) không yêu cầu khởi động lại (nhưng nó sẽ chỉ được tải trong các phiên mới) và b) làm cho nó chỉ có thể bật cho một số người dùng (bằng cách đặt tham số này với ALTER ROLE SET ).

Như vậy, thiết lập cấu hình cơ bản cho auto_explain có thể trông giống như sau:

 session_preload_libraries =auto_explainauto_explain.log_min_duration =100auto_explain.log_analyze =trueauto_explain.log_buffers =trueauto_explain.log_format =JSON 

Nếu bạn đang sử dụng một nhà cung cấp dịch vụ lưu trữ khác, bạn nên kiểm tra xem họ có hỗ trợ auto_explain hay không. Ví dụ:RDS Postgres thì có, nhưng không giống như ScaleGrid, nó bị tắt theo mặc định, vì vậy bạn cần chỉnh sửa cấu hình để chạy.

Đang tải auto_explain vào một phiên duy nhất

Nếu bạn không muốn auto_explain tự động chạy trong các phiên, với tư cách là người dùng cấp cao, bạn cũng có tùy chọn tải nó vào một phiên duy nhất:

 TẢI 'auto_explain'; 

Điều này có thể cực kỳ hữu ích cho các phiên gỡ lỗi một lần nhưng đương nhiên là không cần thiết nếu bạn có thể để nó chạy.

auto_explain giới hạn và lỗi

Chúng tôi đã đề cập đến một số trong số này nhưng có vẻ như đây là thời điểm hợp lý để nhắc nhở bản thân về một số nhược điểm và hạn chế của auto_explain.

Thứ nhất, đặc biệt là khi theo dõi thời gian cho mỗi hoạt động, có thể có chi phí có thể đo lường khi sử dụng auto_explain. Nó có thể thấp, ngay cả khi đo thời gian, nhưng bạn nên tự kiểm tra hơn bao giờ hết.

Thứ hai, thời gian auto_explain không bao gồm thời gian lập kế hoạch truy vấn. Thời gian lập kế hoạch thường rất nhỏ đối với các truy vấn chậm, nhưng trong những trường hợp đặc biệt, nó có thể chịu trách nhiệm cho phần lớn vấn đề. Do đó, hãy nhớ rằng những trường hợp này có thể không hiển thị trong nhật ký của bạn hoặc nếu có, sự khác biệt với những gì bạn đang thấy về tổng độ trễ có thể liên quan đến thời gian lập kế hoạch. Hướng dẫn sử dụng EXPLAIN ANALYZE sẽ nhanh chóng giúp bạn phát hiện ra điều này.

Cách sử dụng đầu ra giải thích để tăng tốc truy vấn

Sau khi bạn có kết quả giải thích cho các truy vấn chậm nhất của mình, bây giờ bạn có thể bắt đầu xem xét việc tăng tốc chúng!

Bạn sẽ cần lấy các kế hoạch truy vấn ra khỏi nhật ký, bạn có thể sử dụng pgBadger để làm điều này nếu bạn không sử dụng dịch vụ được quản lý thực hiện việc này cho bạn.

Xem xét các kế hoạch GIẢI THÍCH là một chủ đề lớn theo đúng nghĩa của nó. Tài liệu PostgreSQL bao gồm phần giới thiệu ngắn gọn nhưng hay về cách sử dụng EXPLAIN và bài viết của Thoughbot về cách đọc GIẢI THÍCH PHÂN TÍCH là một bước tốt tiếp theo. Nếu bạn thích một cuộc nói chuyện kéo dài một giờ, GIẢI THÍCH do Josh Berkus giải thích là rất xuất sắc. Để biết thêm thông tin, Depesz có một loạt bài đăng có tên Giải thích điều không thể giải thích được và nhóm pgMustard có một Bảng chú giải thuật ngữ GIẢI THÍCH khá toàn diện.

Nếu bạn cần sự trợ giúp từ các chuyên gia PostgreSQL để quản lý cơ sở dữ liệu và tăng tốc các truy vấn chậm của mình, hãy dùng thử ScaleGrid. Chúng tôi cung cấp dịch vụ hỗ trợ cấp doanh nghiệp miễn phí 24/7 có thể hướng dẫn bạn giải quyết các truy vấn chậm này và giúp bạn tối ưu hóa tất cả các truy vấn đó. Bản dùng thử miễn phí 30 ngày của chúng tôi mang lại cho bạn nhiều thời gian để thử nhiều tính năng dành cho PostgreSQL và các cơ sở dữ liệu được hỗ trợ khác của chúng tôi.

Chúng tôi hy vọng điều này cung cấp cho bạn mọi thứ bạn cần để bắt đầu với auto_explain và bắt đầu tăng tốc bất kỳ truy vấn chậm nào mà bạn có. Nếu bạn muốn biết thêm điều gì, hãy liên hệ.


  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ắt đầu với Shareplex trên Windows trên AWS, Phần 2

  2. Phỏng vấn Oren Eini của RavenDB về quản lý cơ sở dữ liệu, phân tích và bảo mật

  3. Kết nối với Sage từ Java

  4. Kiểm tra ràng buộc trong SQL

  5. Sự kiện và Chủ đề trong .NET