এ নিয়ে আমরা বহুবার আলোচনা করেছি। তথ্য স্কিমা নির্দিষ্ট উদ্দেশ্যে পরিবেশন করে। আপনি যদি সিস্টেম ক্যাটালগগুলি সম্পর্কে আপনার উপায় জানেন তবে সেগুলি বেশিরভাগ উদ্দেশ্যে আরও ভাল কাজ করে , আইএমও। সিস্টেম ক্যাটালগগুলি সমস্ত তথ্যের আসল উত্স।
তথ্য স্কিমা আদর্শায়িত দেখা হয়েছে সেই বহনযোগ্যতা, বেশিরভাগ প্রধান Postgres সংস্করণ জুড়ে সাহায্যের কারণ বিভিন্ন RDBMS প্ল্যাটফর্ম জুড়ে বহনযোগ্যতা সাধারণত একটি বিভ্রম একবার আপনার প্রশ্ন সিস্টেম ক্যাটালগ সন্ধান করার প্রয়োজন অত্যাধুনিক যথেষ্ট প্রদান করে। এবং উল্লেখযোগ্যভাবে, ওরাকল এখনও তথ্যের স্কিমা সমর্থন করে না।
তথ্যের স্কীমের ভিউগুলিকে মান অনুসরণ করে একটি ফর্ম্যাট অর্জন করতে অবশ্যই অনেক হুপের মধ্য দিয়ে যেতে হবে। এটি তাদের ধীর করে তোলে, কখনও কখনও খুব ধীর করে তোলে । এই বেসিক বস্তুর জন্য পরিকল্পনা এবং কর্মক্ষমতা তুলনা করুন:
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
সম্পর্কিত উত্তর:
ভাল ও বিপরীতে একটি তালিকা , সবচেয়ে বড় পেশাদার (আইএমও) সাহসী:
তথ্য স্কিমা দর্শন
- প্রায়শই সহজ (নির্ভর করে)
- ধীর
- প্রিপ্রোসেসড, যা আপনার প্রয়োজন অনুসারে বা নাও পারে
- বাছাই করা (ব্যবহারকারীরা কেবলমাত্র সেগুলির জন্য বিশেষাধিকারযুক্ত জিনিসগুলি দেখে)
- একটি এসকিউএল স্ট্যান্ডার্ড অনুসারে (এটি কিছু বড় আরডিবিএমএস প্রয়োগ করে)
- প্রধানত পোস্টগ্রিজ সংস্করণ জুড়ে বহনযোগ্য
- পোস্টগ্রিস সম্পর্কে খুব নির্দিষ্ট জ্ঞানের প্রয়োজন নেই
- সনাক্তকারীরা বর্ণনামূলক, দীর্ঘ এবং কখনও কখনও বিশ্রী হয়
সিস্টেম ক্যাটালগ
- উত্সের কাছাকাছি প্রায়শই আরও জটিল (নির্ভরশীল)
- দ্রুত
- সম্পূর্ণ (যেমন সিস্টেম কলাম
oid
অন্তর্ভুক্ত)
- একটি এসকিউএল স্ট্যান্ডার্ড অনুসরণ না
- বড় পোস্টগ্রিজ সংস্করণ জুড়ে কম পোর্টেবল (তবে মূল বিষয়গুলি পরিবর্তন হবে না)
- পোস্টগ্রিস সম্পর্কে আরও নির্দিষ্ট জ্ঞানের প্রয়োজন
- সনাক্তকারীগুলি সংক্ষিপ্ত, কম বর্ণনামূলক তবে স্বাচ্ছন্দ্যে সংক্ষিপ্ত
নির্বিচার জিজ্ঞাসা
কোনও ক্যোয়ারী থেকে কলামের নাম এবং ধরণের একই তালিকা পেতে, আপনি একটি সহজ কৌশলটি ব্যবহার করতে পারেন: ক্যোয়ারী আউটপুট থেকে একটি অস্থায়ী টেবিল তৈরি করুন , তারপরে উপরের মতো একই কৌশলগুলি ব্যবহার করুন।
আপনি সংযুক্ত করতে পারেন LIMIT 0
, যেহেতু আপনার প্রকৃত ডেটার প্রয়োজন নেই:
CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT 0;
পৃথক কলামগুলির ডেটা ধরণের তথ্য পেতে, আপনি এই ফাংশনটিও ব্যবহার করতে পারেন pg_typeof()
:
SELECT pg_typeof(1);