PostgreSQL 9.4 Bảng này được tạo ra như sau:Tại sao không thể chỉ sử dụng Chỉ mục Quét trên chỉ mục được tạo với COALESCE?
CREATE TABLE foo (
id integer,
date date,
value numeric(14,3)
);
tôi tối ưu hóa một truy vấn bằng cách sử dụng chức năng ROW_NUMBER()
cửa sổ và COALESCE
. Cho hiệu quả nhất, tôi có xu hướng sử dụng Index Only Scan
trong truy vấn sau đây:
SELECT id, c_val
FROM (
SELECT id, COALESCE(value, 0) c_val, ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC NULLS LAST) rn
FROM foo) sbt
WHERE sbt.rn = 1;
Vì vậy, nếu tôi tạo ra các chỉ số như sau:
CREATE INDEX ON foo (id, date DESC NULLS LAST, value);
các nhà quy hoạch chọn để sử dụng Index Only Scan
, nhưng nếu tôi làm theo cách này:
CREATE INDEX ON foo (id, date DESC NULLS LAST, COALESCE(value, 0));
người lập kế hoạch sẽ làm chỉ Index Scan
.
Tại sao? Tôi đang cố gắng tránh chi phí đánh giá chức năng COALESCE
trong khi thực hiện truy vấn. Tại sao nó không hoạt động với Index Only Scan
?
"Chi phí" của 'coalesce()' gần bằng 0, đừng lo lắng về điều đó. –