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

Postgresql join_collapse_limit và thời gian lập kế hoạch truy vấn

Phiên bản 9.4 mới của PostgreSQL (chưa được phát hành tại thời điểm viết bài này) sẽ thêm thời gian lập kế hoạch vào EXPLAINEXPLAIN ANALYZE và vì vậy bạn sẽ có thể sử dụng chúng.

Đối với các phiên bản cũ hơn, giả định của bạn là đúng, cách tốt hơn để xác định thời gian lập kế hoạch là thực hiện EXPLAIN đơn giản (không có ANALYZE ) và kiểm tra thời gian mất, trong psql bạn có thể làm điều đó bằng cách bật \timing (Tôi thường làm điều đó tại ~/.psqlrc ).

Nhóm tin tặc PostgreSQL đã thảo luận về việc nâng nó lên các giá trị lớn hơn . Nhưng có vẻ như họ không thể đảm bảo rằng nó sẽ tốt cho mọi trường hợp.

Vấn đề là lập kế hoạch để tìm thứ tự tham gia tốt nhất cho N bảng có O(N!) cách tiếp cận (giai thừa). Và do đó, những con số tăng rất cao, bạn có thể đơn giản thấy điều đó với truy vấn sau:

$ SELECT i, (i)! AS num_comparisons FROM generate_series(8, 20) i;
 i  |   num_comparisons   
----+---------------------
  8 |               40320
  9 |              362880
 10 |             3628800
 11 |            39916800
 12 |           479001600
 13 |          6227020800
 14 |         87178291200
 15 |       1307674368000
 16 |      20922789888000
 17 |     355687428096000
 18 |    6402373705728000
 19 |  121645100408832000
 20 | 2432902008176640000
(13 rows)

Như bạn có thể thấy, ở mức mặc định là 8, chúng tôi thực hiện nhiều nhất khoảng 40 nghìn so sánh, 10 mà bạn đề xuất làm cho nó trở thành 3M, vẫn chưa nhiều đối với máy tính hiện đại, nhưng các giá trị tiếp theo bắt đầu trở nên quá lớn, nó chỉ tăng lên quá nhanh, 20 chỉ là điên rồ (21! thậm chí không phù hợp với số nguyên 64 bit).

Tất nhiên, đôi khi bạn có thể đặt nó thành các giá trị lớn hơn như 16, có thể (trên lý thuyết) tạo ra khoảng 20 nghìn tỷ so sánh và vẫn có thời gian lập kế hoạch rất tốt, đó là vì PostgreSQL đã cắt một số đường dẫn trong khi lập kế hoạch và không cần để luôn luôn kiểm tra tất cả các đơn đặt hàng, nhưng giả sử rằng nó sẽ luôn như vậy và đặt các giá trị cao như vậy làm mặc định, có vẻ không phải là một cách tiếp cận tốt đối với tôi. Có thể có một số truy vấn không mong muốn trong tương lai khiến nó phải kiểm tra tất cả các đơn đặt hàng và sau đó bạn chỉ có một truy vấn duy nhất khiến máy chủ của bạn ngừng hoạt động.

Theo kinh nghiệm của tôi, tôi giả định 10 là giá trị mặc định trên bất kỳ cài đặt nào trong các máy chủ tốt, một số trong số đó tôi thậm chí sử dụng 12. Tôi khuyên bạn nên đặt nó thành 10, nếu bạn thích và đôi khi, hãy thử đặt nó cao hơn ( Tôi sẽ không vượt quá 12) và tiếp tục theo dõi (chặt chẽ) để xem nó hoạt động như thế nào.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gói pg nodejs dẫn đến 'cú pháp nhập không hợp lệ cho kiểu json'

  2. gitlab Lỗi 500 sau khi cập nhật khi xem các dự án

  3. Sắp xếp các giá trị rỗng sau tất cả các giá trị khác, ngoại trừ giá trị đặc biệt

  4. PL / Perl gửi thư trong Postgresql

  5. Lỗi postgres khi cập nhật dữ liệu cột