เรามีการพูดคุยกันหลายครั้ง สคีมาข้อมูลมีวัตถุประสงค์บางอย่าง ถ้าคุณรู้ทางของคุณไปรอบ ๆ แคตตาล็อกระบบเหล่านั้นจะให้บริการตามวัตถุประสงค์ที่ดีที่สุดIMO แคตตาล็อกระบบเป็นแหล่งข้อมูลจริงทั้งหมด
สคีข้อมูลให้มุมมองที่ความช่วยเหลือเกี่ยวกับการพกพาส่วนใหญ่ข้ามรุ่น Postgres ที่สำคัญเนื่องจากพกพาข้ามแพลตฟอร์ม RDBMS ที่แตกต่างกันมักจะเป็นภาพลวงตาครั้งเดียวคำสั่งของคุณมีมากพอที่จะมีความซับซ้อนจำเป็นที่จะต้องขึ้นไปดูแคตตาล็อกระบบมาตรฐาน และที่สำคัญที่สุดคือOracle ยังไม่รองรับโครงสร้างข้อมูล
มุมมองในสคีมาข้อมูลต้องข้ามหลายห่วงเพื่อให้ได้รูปแบบที่สอดคล้องกับมาตรฐาน ทำให้ช้าบางครั้งช้ามาก เปรียบเทียบแผนและประสิทธิภาพสำหรับวัตถุพื้นฐานเหล่านี้:
EXPLAIN ANALYZE SELECT * from information_schema.columns;
EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;
ความแตกต่างที่น่าทึ่ง มันขึ้นอยู่กับสิ่งที่คุณกำลังมองหา
ตัวอย่างของคุณ
สำหรับตัวอย่างของคุณSELECT * from tbl
ให้เปรียบเทียบทั้งสองเคียวรีด้านล่างสำหรับตารางอย่างง่ายนี้:
CREATE TEMP TABLE foo(
A numeric(12,3)
, b timestamp(0)
);
การใช้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()
ส่งคืนชนิดที่สมบูรณ์พร้อมกับตัวดัดแปลงทั้งหมด:
attname | type
--------+-------------------------------
a | numeric(12,3)
b | timestamp(0) without time zone
นอกจากนี้ทราบว่านักแสดงที่จะแก้ไขชื่อตารางค่อนข้างชาญฉลาดตามปัจจุบันregclass
search_path
นอกจากนี้ยังเพิ่มข้อยกเว้นหากชื่อไม่ถูกต้อง รายละเอียด:
การใช้information_schema.columns
:
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'foo'
ORDER BY ordinal_position;
ข้อมูลมีมาตรฐาน แต่ไม่สมบูรณ์ :
column_name | data_type
------------+----------------------------
a | numeric
b | timestamp without time zone
ในการรับข้อมูลทั้งหมดสำหรับประเภทข้อมูลคุณต้องพิจารณาคอลัมน์เหล่านี้ทั้งหมดเพิ่มเติม:
character_maximum_length
character_octet_length
numeric_precision
numeric_precision_radix
numeric_scale
datetime_precision
interval_type
interval_precision
คำตอบที่เกี่ยวข้อง:
รายการข้อดี & ข้อเสียข้อดีที่ใหญ่ที่สุด (IMO) เป็นตัวหนา:
มุมมองสคีมาข้อมูล
- มักจะง่ายกว่า (ขึ้นอยู่กับ)
- ช้า
- ประมวลผลล่วงหน้าซึ่งอาจหรืออาจไม่เหมาะสมกับความต้องการของคุณ
- selective (ผู้ใช้เห็นเฉพาะวัตถุที่มีสิทธิ์)
- สอดคล้องกับมาตรฐาน SQL (ที่นำมาใช้โดย RDBMS หลักบางส่วน)
- ส่วนใหญ่พกพาข้ามรุ่น Postgres หลัก
- ไม่ต้องการความรู้เฉพาะเกี่ยวกับ Postgres
- ตัวระบุมีความหมายยาวและบางครั้งก็น่าอึดอัดใจ
แคตตาล็อกระบบ
- มักจะซับซ้อนมากขึ้น (ขึ้นอยู่กับ) ใกล้แหล่งที่มา
- รวดเร็ว
- สมบูรณ์ (คอลัมน์ระบบเหมือน
oid
รวมอยู่)
- ไม่ปฏิบัติตามมาตรฐาน SQL
- พกพาได้น้อยลงในเวอร์ชันหลักของ Postgres (แต่พื้นฐานจะไม่เปลี่ยนแปลง)
- ต้องการความรู้เฉพาะเพิ่มเติมเกี่ยวกับ Postgres
- ตัวบ่งชี้สั้นกระชับบรรยายสั้น แต่สะดวก
แบบสอบถามโดยพลการ
ในการรับรายการชื่อคอลัมน์และชนิดเดียวกันจากแบบสอบถามคุณสามารถใช้เคล็ดลับง่ายๆ: สร้างตารางชั่วคราวจากผลลัพธ์แบบสอบถามจากนั้นใช้เทคนิคเดียวกับข้างต้น
คุณสามารถผนวกLIMIT 0
เนื่องจากคุณไม่ต้องการข้อมูลจริง:
CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT 0;
ในการรับชนิดข้อมูลของแต่ละคอลัมน์คุณสามารถใช้ฟังก์ชันpg_typeof()
:
SELECT pg_typeof(1);