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::texttidak 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
IMMUTABLEfungsi diperbolehkan dalam ekspresi indeks dan mentransmisikan tipe baris ketexttidak lulus persyaratan ini. Anda dapat membuatIMMUTABLEfake 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 INDEXkarena pengidentifikasi selalu menetapkan nama kolom terlebih dahulu. -
Perbedaan kecil dengan aslinya:Ini menambahkan pemisah kolom, dekorator baris, dan kemungkinan karakter escape ke
textperwakilan. 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: