Để đo kích thước của hàng trong biểu diễn văn bản, bạn chỉ có thể truyền toàn bộ hàng thành văn bản, nhanh hơn nhiều so với việc nối các cột riêng lẻ:
SELECT length(profile::text) FROM profile;
Nhưng có 3 (hoặc 4) vấn đề với biểu thức này trong một chỉ mục:
-
Viết tắt cú pháp
profile::text
không được chấp nhận trongCREATE INDEX
, bạn cần thêm dấu ngoặc đơn hoặc đặt mặc định cho cú pháp chuẩncast(profile AS text)
-
Vẫn là vấn đề tương tự mà @jjanes đã thảo luận :only
IMMUTABLE
được phép sử dụng các hàm trong biểu thức chỉ mục và truyền một loại hàng thànhtext
không vượt qua yêu cầu này. Bạn có thể tạoIMMUTABLE
giả chức năng wrapper, như Jeff đã phác thảo. -
Có một sự mơ hồ cố hữu (điều đó cũng áp dụng cho câu trả lời của Jeff!):nếu bạn có tên cột giống với tên bảng (đây là trường hợp phổ biến), bạn không thể tham chiếu loại hàng trong
CREATE INDEX
vì mã định danh luôn phân giải thành tên cột trước tiên. -
Sự khác biệt nhỏ so với bản gốc của bạn:Điều này thêm dấu phân tách cột, bộ trang trí hàng và có thể ký tự thoát vào văn bản
text
sự đại diện. Sẽ không quan trọng nhiều đối với trường hợp sử dụng của bạn.
Tuy nhiên , Tôi sẽ đề xuất một giải pháp thay thế triệt để hơn làm chỉ báo thô cho kích thước của một hàng: pg_column_size()
. Thậm chí ngắn hơn, nhanh hơn và tránh các vấn đề 1 , 3 và 4 :
SELECT pg_column_size(profile) FROM profile;
Vấn đề 2 Tuy nhiên, vẫn còn:pg_column_size()
cũng chỉ STABLE
. Bạn có thể tạo một hàm trình bao bọc SQL đơn giản và rẻ tiền:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
và sau đó tiếp tục như @jjanes đã nêu. Thêm chi tiết:
Lưu ý rằng tôi đã tạo hàm với loại hàng profile
dưới dạng tham số. Postgres cho phép nạp chồng hàm, đó là lý do tại sao chúng ta có thể sử dụng cùng một tên hàm. Bây giờ, khi chúng tôi cấp loại hàng phù hợp cho pg_column_size()
hàm tùy chỉnh của chúng tôi khớp chặt chẽ hơn theo độ phân giải loại hàm quy tắc và được chọn thay vì hàm hệ thống đa hình. Ngoài ra, hãy sử dụng một tên riêng và có thể làm cho hàm đa hình ...
Có liên quan: