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
CŨ 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.