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

PostgreSQL giải thích cho tôi biết chính xác là gì?

Phần tôi luôn cảm thấy khó hiểu là chi phí khởi động và tổng chi phí. Tôi Google điều này mỗi khi tôi quên nó, điều này đưa tôi trở lại đây, điều này không giải thích sự khác biệt, đó là lý do tại sao tôi viết câu trả lời này. Đây là những gì tôi thu thập được từ EXPLAIN của Postgres tài liệu, được giải thích khi tôi hiểu.

Đây là một ví dụ từ một ứng dụng quản lý một diễn đàn:

EXPLAIN SELECT * FROM post LIMIT 50;

Limit  (cost=0.00..3.39 rows=50 width=422)
  ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

Đây là giải thích bằng hình ảnh từ PgAdmin:

(Khi bạn đang sử dụng PgAdmin, bạn có thể trỏ chuột vào một thành phần để đọc chi tiết chi phí.)

Chi phí được biểu thị dưới dạng một bộ giá trị, ví dụ:chi phí của LIMITcost=0.00..3.39 và chi phí quét tuần tự postcost=0.00..15629.12 . Số đầu tiên trong tuple là chi phí khởi động và số thứ hai là tổng chi phí . Vì tôi đã sử dụng EXPLAIN chứ không phải EXPLAIN ANALYZE , những chi phí này là ước tính, không phải là thước đo thực tế.

  • Chi phí khởi động là một khái niệm phức tạp. Nó không chỉ đại diện cho lượng thời gian trước khi thành phần đó bắt đầu . Nó đại diện cho khoảng thời gian từ khi thành phần bắt đầu thực thi (đọc dữ liệu) đến khi thành phần xuất ra hàng đầu tiên .
  • Tổng chi phí là toàn bộ thời gian thực thi của thành phần, từ khi nó bắt đầu đọc dữ liệu đến khi nó kết thúc việc ghi đầu ra.

Như một điều phức tạp, chi phí của mỗi nút "cha" bao gồm chi phí của các nút con của nó. Trong biểu diễn văn bản, cây được biểu diễn bằng cách thụt lề, ví dụ:LIMIT là một nút cha và Seq Scan là con của nó. Trong biểu diễn PgAdmin, các mũi tên trỏ từ con đến cha - hướng của luồng dữ liệu - có thể phản trực giác nếu bạn đã quen với lý thuyết đồ thị.

Tài liệu nói rằng chi phí đã bao gồm tất cả các nút con, nhưng hãy lưu ý rằng tổng chi phí của nút mẹ 3.39 nhỏ hơn nhiều so với tổng chi phí của nó 15629.12 . Tổng chi phí không được bao gồm vì một thành phần như LIMIT không cần phải xử lý toàn bộ đầu vào của nó. Xem EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2; ví dụ trong Postgres EXPLAIN tài liệu.

Trong ví dụ trên, thời gian khởi động bằng 0 cho cả hai thành phần, vì cả hai thành phần đều không cần thực hiện bất kỳ quá trình xử lý nào trước khi bắt đầu ghi các hàng:quét tuần tự đọc hàng đầu tiên của bảng và phát ra. LIMIT đọc hàng đầu tiên của nó và sau đó phát ra nó.

Khi nào thì một thành phần cần phải thực hiện nhiều xử lý trước khi nó có thể bắt đầu xuất ra bất kỳ hàng nào? Có rất nhiều lý do có thể xảy ra, nhưng hãy xem một ví dụ rõ ràng. Đây là cùng một truy vấn từ trước nhưng hiện có chứa ORDER BY mệnh đề:

EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;

Limit  (cost=23283.24..23283.37 rows=50 width=422)
  ->  Sort  (cost=23283.24..23859.27 rows=230412 width=422)
        Sort Key: body
        ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

Và bằng đồ thị:

Một lần nữa, quét tuần tự trên post không có chi phí khởi động:nó bắt đầu xuất các hàng ngay lập tức. Nhưng loại này có chi phí khởi động đáng kể 23283.24 bởi vì nó phải sắp xếp toàn bộ bảng trước khi có thể xuất ra ngay cả một hàng duy nhất . Tổng chi phí của việc sắp xếp 23859.27 chỉ cao hơn một chút so với chi phí khởi động, phản ánh thực tế là khi toàn bộ tập dữ liệu đã được sắp xếp, dữ liệu được sắp xếp có thể được phát ra rất nhanh chóng.

Lưu ý rằng thời gian khởi động của LIMIT 23283.24 chính xác bằng thời gian khởi động của loại. Điều này không phải vì LIMIT bản thân nó có thời gian khởi động cao. Nó thực sự không có thời gian khởi động, nhưng EXPLAIN tổng hợp tất cả chi phí con cho mỗi phụ huynh, vì vậy LIMIT thời gian khởi động bao gồm tổng thời gian khởi động của các con của nó.

Việc tổng hợp chi phí này có thể gây khó khăn cho việc hiểu chi phí thực hiện của từng thành phần riêng lẻ. Ví dụ:LIMIT của chúng tôi không có thời gian khởi động, nhưng điều đó không rõ ràng ở cái nhìn đầu tiên. Vì lý do này, một số người khác đã liên kết tới giải thích.depesz.com, một công cụ được tạo bởi Hubert Lubaczewski (còn gọi là depesz) giúp hiểu EXPLAIN bằng cách - trong số những thứ khác - trừ đi chi phí con cái khỏi chi phí của phụ huynh. Anh ấy đề cập đến một số sự phức tạp khác trong một bài đăng blog ngắn về công cụ của anh ấy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách liệt kê Cơ sở dữ liệu và Bảng trong PostgreSQL bằng psql

  2. Sự phát triển của khả năng chịu lỗi trong PostgreSQL

  3. Làm thế nào để khôi phục tệp kết xuất PostgreSQL vào cơ sở dữ liệu Postgres?

  4. Liên kết tham số mảng với truy vấn gốc

  5. Có thể thực hiện các truy vấn cơ sở dữ liệu chéo với PostgreSQL không?