PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

डेटा को सॉर्ट न करें कैसे रखें?

समझने की महत्वपूर्ण बात यह है कि SQL तालिकाओं में कोई क्रम नहीं है . जब आप SELECT . करते हैं तो आपको दिखाई देने वाली पंक्तियों का क्रम बिना ORDER BY . के केवल वही रहता है क्योंकि डेटाबेस के लिए उन्हें किसी अन्य क्रम की तुलना में उस क्रम में प्राप्त करना तेज़ होता है। जब आप टेबल पर क्रमिक स्कैन करते हैं तो PostgreSQL केवल इस क्रम में पंक्तियाँ लौटाएगा; यदि यह क्वेरी के लिए एक इंडेक्स का उपयोग कर सकता है तो आपको आम तौर पर किसी अन्य क्रम में पंक्तियां मिलेंगी।

आपको यह उत्तर मिल सकता है जो मैंने पहले जानकारीपूर्ण लिखा था।

PostgreSQL में, UPDATE s से पंक्तियाँ उन्हें तालिका के भीतर एक अलग स्थान पर ले जा सकती हैं, जिस क्रम में वे वापस आ गए हैं उसे बदल सकते हैं। तो क्या पृष्ठभूमि ऑटोवैक्यूम प्रक्रिया और विभिन्न अन्य ऑपरेशन जैसे VACUUM हो सकते हैं और CLUSTER .

तो आपको कभी नहीं . करना चाहिए किसी भी चीज़ के लिए "डिफ़ॉल्ट" ऑर्डरिंग पर भरोसा करें। यदि आप पंक्तियों को किसी प्रकार का आदेश देना चाहते हैं, तो उन्हें जरूरी एक कुंजी है जिस पर आप उन्हें सॉर्ट कर सकते हैं।

यदि आपने बिना चाबी के एक तालिका बनाई है और अब महसूस करते हैं कि इसमें एक होनी चाहिए, तो आप ctid का उपयोग करके स्थिति से उबरने में सक्षम हो सकते हैं। सिस्टम कॉलम। नहीं करें उत्पादन उपयोग के लिए इस पर भरोसा करते हैं, यह एक सिस्टम-आंतरिक कॉलम है जो उपयोगकर्ताओं को केवल आपातकालीन पुनर्प्राप्ति और निदान उद्देश्यों के लिए दिखाई देता है। सबसे पहले, देखें कि क्या भौतिक ऑन-डिस्क ऑर्डरिंग वास्तव में वह ऑर्डर है जो आप चाहते हैं:

SELECT row_number() OVER () AS mytable_id, *
FROM mytable
ORDER BY ctid;

यदि ऐसा है, तो आप एक नया कुंजी कॉलम जोड़ सकते हैं जो ऑन-डिस्क पंक्ति क्रम में लागू एक ऑटो-इंक्रीमेंट की गई कुंजी के लिए पूर्व-सेट है। इसे करने के दो तरीके हैं। सबसे सुरक्षित है:

BEGIN;
LOCK TABLE mytable IN ACCESS EXCLUSIVE MODE;
ALTER TABLE mytable RENAME TO mytable_old;

CREATE TABLE mytable (id SERIAL PRIMARY KEY, LIKE mytable_old INCLUDING ALL);

INSERT INTO mytable
SELECT row_number() OVER () AS id, *
FROM mytable_old
ORDER BY ctid;

SELECT setval('mytable_id_seq', (SELECT max(id)+1 FROM mytable));

COMMIT;

फिर एक बार जब आप सुनिश्चित हो जाएं कि आप परिणामों से खुश हैं, DROP TABLE mytable_old; . यह डेमो देखें:http://sqlfiddle.com/#!12/2cb99/2

एक त्वरित और आसान लेकिन कम सुरक्षित तरीका सिर्फ कॉलम बनाना और शुरू से अंत तक तालिका को फिर से लिखने के लिए PostgreSQL पर भरोसा करना है:

ALTER TABLE mytable ADD COLUMN mytable_id SERIAL PRIMARY KEY;

इसकी बिल्कुल कोई गारंटी नहीं है कि PostgreSQL क्रम में आईडी असाइन करेगा, हालांकि व्यवहार में यह ऐसा करेगा। यह SQLFiddle डेमो देखें।

ध्यान रखें कि जब आप SEQUENCE . का उपयोग करते हैं (जो कि एक SERIAL है कॉलम बनाता है) कुछ ऐसे व्यवहार हैं जिनकी आप अपेक्षा नहीं कर सकते हैं। जब आप एक साथ कई पंक्तियाँ सम्मिलित कर रहे होते हैं, तो पंक्तियों को आवश्यक रूप से उसी क्रम में निर्दिष्ट आईडी नहीं मिल सकती हैं जिसकी आप उनसे अपेक्षा करते हैं, और वे उस क्रम में एक अलग क्रम में "प्रकट" (दृश्यमान हो सकते हैं) हो सकते हैं, जिस क्रम में उन्हें आईडी सौंपी गई थी और डाला गया था। इसके अलावा, यदि लेन-देन वापस आ जाता है, तो उत्पन्न आईडी हमेशा के लिए फेंक दी जाती है, इसलिए आपको नंबरिंग में अंतराल मिलता है। यह बहुत अच्छा है यदि आप चाहते हैं कि आपका डेटाबेस तेज़ हो, लेकिन यदि आप गैप-लेस नंबरिंग चाहते हैं तो यह आदर्श नहीं है। अगर आपको यही चाहिए, तो "postgresql गैपलेस सीक्वेंस" खोजें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं एएससीआईआई (आईएसओ/आईईसी 8859-1) से अपने रेल/पीजीएसक्यूएल डेटाबेस में डेटा कैसे आयात कर सकता हूं?

  2. Postgres jsonb में सरणियों में संरचनाओं को क्वेरी करने के लिए उचित सूचकांक क्या है?

  3. ClusterControl CLI का उपयोग करके PostgreSQL और TimescaleDB बैकअप बहाली

  4. PostgreSQL डेटाबेस का ऑडिट कैसे करें

  5. PostgreSQL - किसी अन्य सेल मान के अनुसार डिफ़ॉल्ट सेल मान सेट करें