PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:Buat indeks pada panjang semua bidang tabel

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:

  1. Sintaks singkatan profile::text tidak diterima di CREATE INDEX , Anda perlu menambahkan tanda kurung tambahan atau default ke sintaks standar cast(profile AS text)

  2. Masih masalah yang sama yang @jjanes sudah dibahas :hanya IMMUTABLE fungsi diperbolehkan dalam ekspresi indeks dan mentransmisikan tipe baris ke text tidak lulus persyaratan ini. Anda dapat membuat IMMUTABLE fake palsu fungsi pembungkus, seperti yang dijelaskan Jeff.

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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO dapatkan pecahan detik dari Postgres

  2. Pembagian PostgreSQL dengan nol saat memesan

  3. Basis data yang bertahan menggunakan volume buruh pelabuhan

  4. Dapatkan waktu eksekusi kueri PostgreSQL

  5. Tambahkan Properti ke Objek yang dikembalikan oleh Sequelize FindOne