Kami telah berdiskusi tentang hal ini berkali-kali. Skema informasi melayani tujuan tertentu. Jika Anda tahu jalan di katalog sistem, yang melayani sebagian besar tujuan lebih baik , IMO. Katalog sistem adalah sumber aktual semua informasi.
The informasi skema menyediakan standar pandangan yang membantu dengan portabilitas, sebagian besar di versi Postgres besar, karena portabilitas di seluruh platform RDBMS yang berbeda biasanya adalah ilusi sekali pertanyaan Anda yang cukup canggih untuk kebutuhan untuk mencari katalog sistem. Dan, terutama, Oracle masih tidak mendukung skema informasi.
Tampilan dalam skema informasi harus melewati banyak rintangan untuk mencapai format yang memenuhi standar. Ini membuat mereka lambat, terkadang sangat lambat. Bandingkan paket dan kinerja untuk objek-objek dasar ini:
EXPLAIN ANALYZE SELECT * from information_schema.columns;
EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;
Perbedaannya luar biasa. Itu benar-benar tergantung pada apa yang Anda cari.
Contoh anda
Sebagai contoh Anda SELECT * from tbl
, bandingkan dua kueri di bawah ini untuk tabel sederhana ini:
CREATE TEMP TABLE foo(
A numeric(12,3)
, b timestamp(0)
);
Menggunakan pg_attribute
:
SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = 'foo'::regclass
AND attnum > 0
AND NOT attisdropped
ORDER BY attnum;
format_type()
mengembalikan tipe lengkap dengan semua pengubah:
attname | type
--------+-------------------------------
a | numeric(12,3)
b | timestamp(0) without time zone
Juga perhatikan bahwa para pemain untuk regclass
menyelesaikan nama tabel agak cerdas sesuai dengan saat ini search_path
. Itu juga menimbulkan pengecualian jika nama tidak valid. Detail:
Menggunakan information_schema.columns
:
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'foo'
ORDER BY ordinal_position;
Informasi terstandarisasi, tetapi tidak lengkap :
column_name | data_type
------------+----------------------------
a | numeric
b | timestamp without time zone
Untuk mendapatkan informasi lengkap untuk tipe data, Anda perlu mempertimbangkan semua kolom ini sebagai tambahan:
character_maximum_length
character_octet_length
numeric_precision
numeric_precision_radix
numeric_scale
datetime_precision
interval_type
interval_precision
Jawaban terkait:
Daftar pro & kontra , pro terbesar (IMO) dicetak tebal:
Tampilan skema informasi
- seringkali lebih sederhana (tergantung)
- lambat
- preprocessed, yang mungkin sesuai atau tidak dengan kebutuhan Anda
- selektif (pengguna hanya melihat objek yang memiliki hak istimewa untuk mereka)
- sesuai dengan standar SQL (yang diimplementasikan oleh beberapa RDBMS utama)
- sebagian besar portabel di seluruh versi Postgres utama
- tidak memerlukan banyak pengetahuan khusus tentang Postgres
- pengidentifikasi bersifat deskriptif, panjang dan terkadang canggung
Katalog sistem
- seringkali lebih kompleks (tergantung), lebih dekat ke sumbernya
- cepat
- selesai (kolom sistem seperti
oid
termasuk)
- tidak memenuhi standar SQL
- kurang portabel di seluruh versi Postgres utama (tetapi dasar-dasarnya tidak akan berubah)
- membutuhkan pengetahuan yang lebih spesifik tentang Postgres
- pengidentifikasi singkat, kurang deskriptif tetapi mudah pendek
Permintaan sewenang-wenang
Untuk mendapatkan daftar nama dan tipe kolom yang sama dari kueri, Anda bisa menggunakan trik sederhana: BUAT tabel sementara dari output kueri, lalu gunakan teknik yang sama seperti di atas.
Anda dapat menambahkan LIMIT 0
, karena Anda tidak memerlukan data aktual:
CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT 0;
Untuk mendapatkan tipe data dari masing-masing kolom, Anda juga dapat menggunakan fungsi pg_typeof()
:
SELECT pg_typeof(1);