Bunun hakkında birçok kez tartıştık. Bilgi şeması belirli amaçlara hizmet eder. Sistem kataloglarında yolunuzu biliyorsanız, bunlar çoğu amaca daha iyi hizmet eder , IMO. Sistem katalogları tüm bilgilerin asıl kaynağıdır.
Bilgi şema sorgularınız sistem katalogları aramak için ihtiyaca sofistike yeterlidir kez farklı RDBMS platformlarındaki taşınabilirlik tipik bir yanılsama olduğu için yardım çoğunlukla büyük Postgres sürümleri arasında taşınabilirlik, birlikte, görüşlerini standardize sağlar. Ve özellikle Oracle hala bilgi şemasını desteklemiyor.
Bilgi şemasındaki görünümler, standarda uygun bir biçim elde etmek için birçok çemberin içinden atlamak zorundadır. Bu onları yavaş, bazen çok yavaş yapar. Bu temel nesneler için planları ve performansı karşılaştırın:
EXPLAIN ANALYZE SELECT * from information_schema.columns;
EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;
Fark dikkat çekicidir. Gerçekten ne aradığınıza bağlıdır.
Örneğiniz
Örneğin SELECT * from tbl
, bu basit tablo için aşağıdaki iki sorguyu karşılaştırın:
CREATE TEMP TABLE foo(
A numeric(12,3)
, b timestamp(0)
);
Kullanma 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()
tüm değiştiricileri içeren tam türü döndürür:
attname | type
--------+-------------------------------
a | numeric(12,3)
b | timestamp(0) without time zone
Ayrıca regclass
, akıma göre tablo adını biraz akıllıca çözecek şekilde yayınlandığına dikkat edin search_path
. Ayrıca, ad geçerli değilse bir istisna oluşturur. Detaylar:
Kullanma information_schema.columns
:
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'foo'
ORDER BY ordinal_position;
Bilgiler standartlaştırılmıştır, ancak eksik :
column_name | data_type
------------+----------------------------
a | numeric
b | timestamp without time zone
Veri türü hakkında tam bilgi almak için bu sütunların tümünü ayrıca dikkate almanız gerekir:
character_maximum_length
character_octet_length
numeric_precision
numeric_precision_radix
numeric_scale
datetime_precision
interval_type
interval_precision
İlgili cevaplar:
Bir listesi artıları ve eksileri , kalın büyük artıları (IMO):
Bilgi şeması görünümleri
- genellikle daha basit (bağlıdır)
- yavaş
- Önceden işlenmiş, ihtiyaçlarınıza uygun olabilir veya olmayabilir
- seçici (kullanıcılar yalnızca ayrıcalıklarına sahip oldukları nesneleri görürler)
- SQL standardına uygunluk (bazı büyük RDBMS'ler tarafından uygulanır)
- çoğunlukla büyük Postgres sürümlerinde taşınabilir
- Postgres hakkında çok özel bilgi gerektirmez
- tanımlayıcılar açıklayıcı, uzun ve bazen gariptir
Sistem katalogları
- genellikle daha karmaşık (bağımlı), kaynağa daha yakın
- hızlı
- complete (
oid
dahil edilen sistem sütunları )
- SQL standardına uymamak
- büyük Postgres sürümlerinde daha az taşınabilir (ancak temel bilgiler değişmeyecek)
- Postgres hakkında daha spesifik bilgi gerektirir
- tanımlayıcılar kısa, daha az açıklayıcı ancak kısa
Rasgele sorgu
Bir sorgudan aynı sütun adları ve türleri listesini almak için basit bir hile kullanabilirsiniz: Sorgu çıktısından geçici bir tablo OLUŞTURUN , sonra yukarıdakiyle aynı teknikleri kullanın.
LIMIT 0
Gerçek verilere ihtiyacınız olmadığından ekleyebilirsiniz.
CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT 0;
Tek tek sütunların veri türünü almak için aşağıdaki işlevi de kullanabilirsiniz pg_typeof()
:
SELECT pg_typeof(1);