PostgreSQL 12 एक नई सुविधा के साथ आता है जिसे जेनरेटेड कॉलम . कहा जाता है . अन्य लोकप्रिय आरडीबीएमएस पहले से ही "गणना किए गए कॉलम" या "वर्चुअल कॉलम" के रूप में जेनरेट किए गए कॉलम का समर्थन करते हैं। Postgres 12 के साथ, अब आप इसे PostgreSQL में भी उपयोग कर सकते हैं। अधिक जानने के लिए पढ़ें।
जेनरेट किया गया कॉलम क्या है?
एक जेनरेट किया गया कॉलम एक दृश्य की तरह है, लेकिन कॉलम के लिए है। यहां एक बुनियादी उदाहरण दिया गया है:
db=# CREATE TABLE t (w real, h real, area real GENERATED ALWAYS AS (w*h) STORED);
CREATE TABLE
db=# INSERT INTO t (w, h) VALUES (10, 20);
INSERT 0 1
db=# SELECT * FROM t;
w | h | area
----+----+------
10 | 20 | 200
(1 row)
db=#
हमने एक तालिका बनाई t w . नामक दो नियमित स्तंभों के साथ और ज , और एक जेनरेट किया गया कॉलम जिसे क्षेत्र . कहा जाता है . क्षेत्र . का मान एट्रो निर्माण समय की गणना की जाती है, और डिस्क पर बनी रहती है।
पंक्ति के अद्यतन होने पर उत्पन्न स्तंभों के मूल्य की पुनर्गणना की जाती है:
db=# UPDATE t SET w=40;
UPDATE 1
db=# SELECT * FROM t;
w | h | area
----+----+------
40 | 20 | 800
(1 row)
db=#
इस तरह की कार्यक्षमता पहले आमतौर पर ट्रिगर्स के साथ हासिल की जाती थी, लेकिन जेनरेट किए गए कॉलम के साथ यह और अधिक सुरुचिपूर्ण और क्लीनर हो जाता है।
जेनरेट किए गए कॉलम के बारे में कुछ बातें जो आपको जाननी चाहिए:
- दृढ़ता :वर्तमान में, जेनरेट किए गए कॉलम के मूल्य को जारी रखना है, और क्वेरी समय पर फ्लाई पर गणना नहीं की जा सकती है। कॉलम परिभाषा में “STORED” कीवर्ड मौजूद होना चाहिए।
- अभिव्यक्ति :मान की गणना करने के लिए प्रयुक्त व्यंजकअपरिवर्तनीय . होना चाहिए , अर्थात्, इसे नियतात्मक होना चाहिए। यह अन्य स्तंभों पर निर्भर हो सकता है, लेकिन तालिका के अन्य उत्पन्न स्तंभों पर नहीं।
- सूचकांक :जेनरेट किए गए कॉलम इंडेक्स में उपयोग किए जा सकते हैं, लेकिन विभाजित टेबल के लिए विभाजन कुंजी के रूप में उपयोग नहीं किया जा सकता है।
- प्रतिलिपि बनाएं और pg_dump :उत्पन्न कॉलम के मान "pg_dump" और "COPY टेबल" कमांड के आउटपुट में छोड़े जाते हैं, क्योंकि यह अनावश्यक है। आप
COPY (SELECT * FROM t) TO STDOUT
का उपयोग करके उन्हें स्पष्ट रूप से COPY में शामिल कर सकते हैंCOPY t TO STDOUT
. के बजाय ।
एक व्यावहारिक उदाहरण
आइए जेनरेट किए गए कॉलम का उपयोग करके तालिका में पूर्ण टेक्स्ट खोज समर्थन जोड़ें। यहाँ एक तालिका है जो शेक्सपियर के सभी नाटकों के संपूर्ण पाठ को संग्रहीत करती है:
CREATE TABLE scenes (
workid text, -- denotes the name of the play (like "macbeth")
act integer, -- the act (like 1)
scene integer, -- the scene within the act (like 7)
description text, -- short desc of the scene (like "Macbeth's castle.")
body text -- full text of the scene
);
यहां बताया गया है कि डेटा कैसा दिखता है:
shakespeare=# SELECT workid, act, scene, description, left(body, 200) AS body_start
shakespeare-# FROM scenes WHERE workid='macbeth' AND act=1 AND scene=1;
workid | act | scene | description | body_start
---------+-----+-------+-----------------+----------------------------------------------
macbeth | 1 | 1 | A desert place. | [Thunder and lightning. Enter three Witches]+
| | | | +
| | | | First Witch: When shall we three meet again +
| | | | In thunder, lightning, or in rain? +
| | | | +
| | | | Second Witch: When the hurlyburly's done, +
| | | | When the battle's lost and won. +
| | | |
(1 row)
हम एक कॉलम जोड़ेंगे जिसमें "बॉडी" के मान में लेक्सेम होंगे। फ़ंक्शन to_tsvector हमें आवश्यक लेक्सेम लौटाता है:
shakespeare=# SELECT to_tsvector('english', 'move moving moved movable mover movability');
to_tsvector
-------------------------------------
'movabl':4,6 'move':1,2,3 'mover':5
(1 row)
to_tsvector
. द्वारा लौटाए गए मान का प्रकार tsvector है।
आइए जनरेट किए गए कॉलम को जोड़ने के लिए टेबल में बदलाव करें:
ALTER TABLE scenes
ADD tsv tsvector
GENERATED ALWAYS AS (to_tsvector('english', body)) STORED;
आप \d
. के साथ परिवर्तन देख सकते हैं :
shakespeare=# \d scenes
Table "public.scenes"
Column | Type | Collation | Nullable | Default
-------------+----------+-----------+----------+----------------------------------------------------------------------
workid | text | | not null |
act | integer | | not null |
scene | integer | | not null |
description | text | | |
body | text | | |
tsv | tsvector | | | generated always as (to_tsvector('english'::regconfig, body)) stored
Indexes:
"scenes_pkey" PRIMARY KEY, btree (workid, act, scene)
और ठीक उसी तरह, अब आप पूर्ण पाठ खोज कर सकते हैं:
shakespeare=# SELECT
workid, act, scene, ts_headline(body, q)
FROM (
SELECT
workid, act, scene, body, ts_rank(tsv, q) as rank, q
FROM
scenes, plainto_tsquery('uneasy head') q
WHERE
tsv @@ q
ORDER BY
rank DESC
LIMIT
5
) p
ORDER BY
rank DESC;
workid | act | scene | ts_headline
----------+-----+-------+-----------------------------------------------------------
henry4p2 | 3 | 1 | <b>Uneasy</b> lies the <b>head</b> that wears a crown. +
| | | +
| | | Enter WARWICK and Surrey +
| | | +
| | | Earl of Warwick
henry5 | 2 | 2 | <b>head</b> assembled them? +
| | | +
| | | Lord Scroop: No doubt, my liege, if each man do his best.+
| | | +
| | | Henry V: I doubt not that; since we are well persuaded +
| | | We carry not a heart with us from hence
(2 rows)
shakespeare=#
और पढ़ें
यदि आपको पूर्व-गणना / "कैश्ड" डेटा की आवश्यकता है, विशेष रूप से कुछ लिखने और बहुत सारे पढ़ने के कार्यभार के साथ, जेनरेट किए गए कॉलम को आपके एप्लिकेशन / सर्वर-साइड कोड को बहुत सरल बनाने में मदद करनी चाहिए।
अपडेट किए गए सिंटैक्स को देखने के लिए आप तालिका बनाएं और तालिका में बदलाव के v12 दस्तावेज़ पढ़ सकते हैं।