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

Tham gia hai bảng bằng cách sử dụng id và con cháu từ bảng giống cây

Tích hợp truy vấn

Cải thiện logic ở một số nơi, bạn có thể tích hợp toàn bộ hoạt động trong một truy vấn duy nhất. Gói vào một hàm SQL là tùy chọn:

CREATE OR REPLACE FUNCTION f_elems(_action_id integer)
  RETURNS SETOF integer AS
$func$
   WITH RECURSIVE l AS (
      SELECT a.category_id, l.local_id
      FROM   action a
      JOIN   local  l USING (local_id)
      WHERE  a.action_id = $1

      UNION ALL 
      SELECT l.category_id, c.local_id
      FROM   l
      JOIN   local c ON c.parent_id = l.local_id  -- c for "child"
      )
   SELECT e.element_id
   FROM   l
   JOIN   element e USING (category_id, local_id);
$func$  LANGUAGE sql STABLE;

Truy xuất tất cả element_id cho người dân địa phương giống nhau và con của một action_id nhất định .

Gọi:

SELECT * FROM f_elem(3);

element_id
-----------
6
7

db <> fiddle tại đây
sqlfiddle

Điều này phải là về cơ bản nhanh hơn vì một số lý do. Những điều rõ ràng nhất là:

  • Thay thế SQL thuần túy để lặp lại chậm trong plpgsql.
  • Thu hẹp tập bắt đầu của truy vấn đệ quy.
  • Xóa IN không cần thiết và nổi tiếng là chậm xây dựng.

Tôi đang gọi bằng SELECT * FROM ... thay vì chỉ SELECT , mặc dù hàng chỉ có một cột duy nhất, để lấy tên cột của OUT tham số (element_id ) Tôi đã khai báo trong tiêu đề hàm.

Nhanh hơn nữa

Chỉ số

Chỉ mục trên action.action_id được cung cấp bởi khóa chính.

Nhưng bạn có thể đã bỏ lỡ chỉ mục trên local.parent_id . Trong khi ở đó, hãy làm cho nó trở thành bao gồm chỉ mục nhiều cột (Postgres 9.2+) với parent_id là phần tử đầu tiên và local_id như thứ hai. Điều này sẽ giúp ích rất nhiều nếu bảng local là lớn. Không quá nhiều hoặc không quá nhiều đối với một chiếc bàn nhỏ:

CREATE INDEX l_mult_idx ON local(parent_id, local_id);

Tại sao? Xem:

Cuối cùng, một chỉ mục nhiều cột trên phần tử element sẽ giúp được nhiều hơn:

CREATE INDEX e_mult_idx ON element (category_id, local_id, element_id);

Cột thứ ba element_id chỉ hữu ích khi làm cho nó trở thành chỉ mục bao trùm . Nếu truy vấn của bạn truy xuất nhiều cột hơn từ phần tử element , bạn có thể muốn thêm nhiều cột hơn vào chỉ mục hoặc thả element_id . Hoặc sẽ làm cho nó nhanh hơn.

Chế độ xem cụ thể hóa

Nếu bảng của bạn nhận được ít hoặc không có cập nhật, một chế độ xem cụ thể hóa cung cấp tập hợp tất cả các cặp được tính toán trước (action_id, element_id) chia sẻ cùng một danh mục sẽ làm cho điều này làm sáng da nhanh chóng . Tạo (action_id, element_id) (theo thứ tự đó) khóa chính.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL Autoincrement

  2. Làm cách nào để dịch PostgreSQL OID bằng python

  3. không thể tải thư viện cho oracle_fdw

  4. CHÈN và tuần tự hóa giao dịch trong PostreSQL

  5. Openshift và net-ssh không tương thích? (2.9.3-beta1 so với 2.9.2)