2013-07-26 22 views
21

में ऑल्टर कमांड के साथ तालिका कॉलम में सॉर्ट कुंजी जोड़ने के लिए कैसे मैं तालिका में किसी कॉलम में सॉर्ट कुंजी जोड़ना चाहता हूं लेकिन तालिका बनाई गई है। तो क्या कोई आदेश है जिसके द्वारा हम कॉलम (फ़ील्ड) में सॉर्ट कुंजी जोड़ सकते हैं।aws redshift

अग्रिम धन्यवाद।

उत्तर

16

इस समय मुझे लगता है कि यह संभव नहीं है (उम्मीद है कि भविष्य में बदल जाएगा)। अतीत में जब मैं इस तरह की स्थिति में भाग गया तो मैंने एक नई टेबल बनाई और पुराने डेटा को उसमें कॉपी किया।

http://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html से

:

जोड़ें [COLUMN] स्तंभ तालिका करने के लिए निर्दिष्ट नाम से कोई स्तंभ जोड़ता है। आप प्रत्येक ALTER तालिका कथन में केवल एक कॉलम जोड़ सकते हैं।

आप वितरण कुंजी (DISTKEY) या तालिका की एक प्रकार कुंजी (सॉर्की) एक कॉलम नहीं जोड़ सकते हैं।

आप एक ALTER तालिका स्तंभ आदेश जोड़ें उपयोग नहीं कर सकते निम्न तालिका और स्तंभ को संशोधित करने के लिए जिम्मेदार बताते हैं:

अद्वितीय

प्राथमिक कुंजी

संदर्भ (विदेशी कुंजी)

पहचान

अधिकतम कॉलम नाम की लंबाई 127 वर्ण है; लंबे नाम 127 वर्णों को छोटा कर दिया गया है। एक तालिका में परिभाषित कॉलम की अधिकतम संख्या 1,600 है।

24

जैसा कि यानिव केसलर ने उल्लेख किया है, तालिका बनाने के बाद विकी और सॉर्ट कुंजी को जोड़ना या बदलना संभव नहीं है, और आपको एक टेबल को फिर से बनाना होगा और सभी डेटा को नई तालिका में कॉपी करना होगा। आप एक नए डिजाइन के साथ एक तालिका को फिर से बनाने के लिए निम्न SQL प्रारूप का उपयोग कर सकते हैं।

ALTER TABLE test_table RENAME TO old_test_table; 
CREATE TABLE new_test_table([new table columns]); 
INSERT INTO new_test_table (SELECT * FROM old_test_table); 
ALTER TABLE new_test_table RENAME TO test_table; 
DROP TABLE old_test_table; 

मेरे अनुभव में, इस एसक्यूएल न केवल distkey और sortkey बदल रहा, लेकिन यह भी एन्कोडिंग (संपीड़न) प्रकार स्थापित करने के लिए प्रयोग किया जाता है।

+0

यह सबसे अच्छा जवाब है। मैं जोड़ सकता हूं कि ऑपरेशन पूर्ण होने के बाद तालिका का नाम बदलना सुरक्षित हो सकता है। –

+1

यह बहुत देर हो चुकी है, लेकिन मैं एक ही स्थिति में हूं और मैंने इस प्रकार के ऑपरेशन के प्रदर्शन के बारे में कुछ खोद दिया है, यह मानते हुए कि तालिका बड़ी है। Redshift दस्तावेज़ों का उल्लेख है कि INSERT INTO सावधानी के साथ उपयोग किया जाना चाहिए, कॉपी का समर्थन या आदेश के रूप में तालिका बनाएँ। [सीटीएएस के लिए उदाहरण] (http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html) इस समस्या का स्पष्ट रूप से उल्लेख करते हैं। – paulsef11

+0

इस विधि के साथ समस्या यह है कि यदि आपके पास मूल तालिका के आधार पर विचार हैं, तो आपकी बूंद काम नहीं करेगी। – Pasha

22

यानिव के उत्तर में जोड़ने के लिए, ऐसा करने का आदर्श तरीका शायद CREATE TABLE AS आदेश का उपयोग कर रहा है। आप स्पष्ट रूप से distkey और sortkey निर्दिष्ट कर सकते हैं। अर्थात।

CREATE TABLE test_table_with_dist 
distkey(field) 
sortkey(sortfield) 
AS 
select * from test_table 

अतिरिक्त उदाहरण:

http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html

संपादित

मैंने देखा है कि इस विधि एन्कोडिंग को सुरक्षित रखने नहीं है। Redshift केवल एक कॉपी कथन के दौरान स्वचालित रूप से एन्कोड करता है। यदि यह एक सतत तालिका है तो आपको तालिका को फिर से परिभाषित करना चाहिए और एन्कोडिंग निर्दिष्ट करना चाहिए।

create table test_table_with_dist(
    field1 varchar encode row distkey 
    field2 timestam pencode delta sortkey); 

insert into test_table select * from test_table; 

आप पता लगा सकते हैं कि कौन सी एन्कोडिंग analyze compression test_table;

0

चलाकर उपयोग करने के लिए मैं अपनी और अधिक या कम एक ही दृष्टिकोण केवल आदेशों की कम संख्या मेरी मेज table_transactons के प्रकार कॉलम जोड़ने के लिए इस दृष्टिकोण का पालन किया।

1) तालिका तालिका_transactions को table_transactions_backup में बदलें; 2) table_transactions_backup से चयन * के रूप में तालिका table_transactions compound sortkey (key1, key2, key3, key4) बनाएं; 3) ड्रॉप तालिका table_transactions_backup;