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

PostgreSQL:cách tốt nhất để tham gia các tập hợp con nhỏ của các bảng lớn

Như bạn đã ám chỉ, cách duy nhất để thực sự biết là để so sánh các kế hoạch thực hiện. Trên thực tế, cách tốt nhất là sử dụng EXPLAIN ANALYZE , để nó thực sự thực thi truy vấn và chèn kết quả vào đầu ra với các ước tính, vì vậy bạn có thể hiểu công cụ lập kế hoạch truy vấn so với thực tế.

Tuy nhiên, nói chung, những gì tôi sẽ làm trong tình huống như thế này có thể là tạo bảng tạm thời cho tập hợp con ứng dụng khách và sau đó là JOIN cho orders bàn. Bạn có thể tùy ý sử dụng WITH thay vào đó để thực hiện mọi thứ trong một truy vấn.

Vì vậy, một cái gì đó như:

CREATE TEMP TABLE tmp_clients AS
SELECT c.clientid
FROM clients c
WHERE c.city = 'New York'
ORDER BY c.clientid;

SELECT *
FROM orders AS o
JOIN tmp_clients AS c ON (o.clientid = c.clientid)
ORDER BY o.clientid;

Bằng cách này, tmp_clients chỉ chứa các khách hàng ở New York - ~ 5K hàng - và chính bảng đó sẽ được kết hợp với bảng đơn đặt hàng.

Bạn cũng có thể, để tối ưu hóa hơn nữa, hãy tạo một chỉ mục trên bảng tạm thời (trên clientid) và sau đó ANALYZE nó trước khi thực hiện JOIN để đảm bảo rằng JOIN được thực hiện hoàn toàn trên chỉ mục. Bạn muốn kiểm tra các kế hoạch truy vấn trong từng trường hợp để xem sự khác biệt tương đối (hoặc chỉ cần ghi nhớ điều này nếu JOIN không nhanh như bạn muốn).

Phản hồi nhận xét từ @poshest:

Nghe giống như bảng tạm thời đang xếp chồng lên nhau, điều này sẽ làm tăng dung lượng bộ nhớ và, đối với một kết nối hoạt động lâu dài, chức năng dường như bị rò rỉ bộ nhớ.

Trong trường hợp đó, nó sẽ không phải là một rò rỉ thực sự, như bảng tạm thời được xác định phạm vi kết nối. Chúng tự động biến mất, nhưng không phải cho đến khi kết nối kết thúc. Tuy nhiên, bạn có thể làm cho chúng biến mất ngay lập tức khi làm xong. Đơn giản chỉ cần DROP bảng như bạn làm với bất kỳ bảng nào khác sau khi bạn hoàn thành chúng và tôi nghi ngờ rằng bạn sẽ có thể gọi hàm nhiều lần - trên cùng một kết nối - mà không cần tăng dấu chân bộ nhớ đơn điệu giống nhau.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. phần trăm từ dữ liệu biểu đồ

  2. So sánh bình đẳng / bất bình đẳng trong SQL với giá trị nullable

  3. String_agg cho nhiều cột

  4. Tại sao truy vấn hết thời gian chờ khi nó nằm trong giới hạn thời gian chờ của nó?

  5. Kế hoạch Cửa hàng Cột