Untuk mengukur ukuran baris dalam representasi teks, Anda cukup memasukkan seluruh baris ke teks, yang jauh lebih cepat daripada menggabungkan kolom individual:
SELECT length(profile::text) FROM profile;
Tetapi ada 3 (atau 4) masalah dengan ekspresi ini dalam indeks:
-
Sintaks singkatan
profile::text
tidak diterima diCREATE INDEX
, Anda perlu menambahkan tanda kurung tambahan atau default ke sintaks standarcast(profile AS text)
-
Masih masalah yang sama yang @jjanes sudah dibahas :hanya
IMMUTABLE
fungsi diperbolehkan dalam ekspresi indeks dan mentransmisikan tipe baris ketext
tidak lulus persyaratan ini. Anda dapat membuatIMMUTABLE
fake palsu fungsi pembungkus, seperti yang dijelaskan Jeff. -
Ada ambiguitas yang melekat pada diri Anda (itu juga berlaku untuk jawaban Jeff!):jika Anda memiliki nama kolom yang sama dengan nama tabel (yang merupakan kasus umum), Anda tidak dapat mereferensikan jenis baris di
CREATE INDEX
karena pengidentifikasi selalu menetapkan nama kolom terlebih dahulu. -
Perbedaan kecil dengan aslinya:Ini menambahkan pemisah kolom, dekorator baris, dan kemungkinan karakter escape ke
text
perwakilan. Seharusnya tidak terlalu penting untuk kasus penggunaan Anda.
Namun , saya akan menyarankan alternatif yang lebih radikal sebagai indikator kasar untuk ukuran baris:pg_column_size()
. Bahkan lebih pendek dan lebih cepat dan menghindari masalah 1 , 3 dan 4 :
SELECT pg_column_size(profile) FROM profile;
Masalah 2 tetap, meskipun:pg_column_size()
juga hanya STABLE
. Anda dapat membuat fungsi pembungkus SQL yang sederhana dan murah:
CREATE OR REPLACE FUNCTION pg_column_size(profile)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT pg_catalog.pg_column_size($1)';
dan kemudian lanjutkan seperti @jjanes diuraikan. Selengkapnya:
Perhatikan bahwa saya membuat fungsi dengan jenis baris profile
sebagai parameter. Postgres memungkinkan fungsi overloading, itulah sebabnya kami dapat menggunakan nama fungsi yang sama. Sekarang, ketika kita memasukkan jenis baris yang cocok ke pg_column_size()
fungsi kustom kami lebih cocok dengan resolusi jenis fungsi aturan dan dipilih bukan fungsi sistem polimorfik. Atau, gunakan nama terpisah dan mungkin buat fungsi polimorfik juga ...
Terkait: