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

PostgreSQL:Tạo chỉ mục theo độ dài của tất cả các trường bảng

Để đ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:

  1. Viết tắt cú pháp profile::text không được chấp nhận trong CREATE INDEX , bạn cần thêm dấu ngoặc đơn hoặc đặt mặc định cho cú pháp chuẩn cast(profile AS text)

  2. 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ành text không vượt qua yêu cầu này. Bạn có thể tạo IMMUTABLE giả chức năng wrapper, như Jeff đã phác thảo.

  3. 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.

  4. 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 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres không nhận ra bảng tạm trong chức năng

  2. Chuyển django RawQuerySet thành Queryset

  3. Bí danh hàm cho hàm mặc định của Postgres

  4. Chuỗi có khóa chính tổng hợp

  5. pgadmin4:máy chủ ứng dụng postgresql không thể liên lạc được.