2011-08-04 12 views
93

क्याINSERT INTO बनाम चयन

SELECT ... INTO MyTable FROM... 

और

INSERT INTO MyTable (...) 
SELECT ... FROM .... 

का उपयोग कर के बीच अंतर है जांच?

बोल [INSERT, SELECT...INTO] से, मुझे पता है कि चयन का उपयोग कर ... में प्रविष्टि तालिका डिफ़ॉल्ट फ़ाइल समूह पर यदि वह पहले से मौजूद नहीं है पैदा करेगा, और कहा कि इस बयान के लिए लॉगिंग पर निर्भर करता है डेटाबेस का वसूली मॉडल।

  1. कौन सा कथन बेहतर है?
  2. क्या अन्य प्रदर्शन प्रभाव हैं?
  3. चयन के लिए एक अच्छा उपयोग केस क्या है ... INSERT में ... पर?

संपादित करें: मैंने पहले ही कहा है कि मुझे पता है कि उसमें चयन करें ... एक टेबल बनाता है जहां यह अस्तित्व में नहीं है। मैं क्या जानना चाहता हूं कि एसक्यूएल में इस कथन को एक कारण के लिए शामिल किया गया है, यह क्या है? क्या यह पंक्तियों को डालने के लिए दृश्यों के पीछे कुछ अलग कर रहा है, या यह CREATE TABLE और INSERT INTO के शीर्ष पर सिंटैक्टिक चीनी है।

+0

एक छोटा सा कारक: 'सम्मिलित INTO' दो प्रमुख शब्द (चयन और में) ठीक सामने है कि दुनिया को पता है यह कोई साधारण एसक्यूएल बयान है चलो ऊपर है, जबकि' चयन करें ... कम से कम, सामान्य SQL कथन की तरह दिखने के लिए शुरू होता है। पूर्व का पक्ष लेने का एक छोटा सा कारण। –

उत्तर

90
  1. वे अलग-अलग चीजें करते हैं। तालिका मौजूद होने पर INSERT का उपयोग करें। SELECT INTO का उपयोग करें जब यह नहीं करता है।

  2. हां। INSERT कोई तालिका संकेत के साथ सामान्य रूप से लॉग इन है। SELECT INTO कम से कम लॉग इन है कि उचित ट्रेस ध्वज सेट कर रहे हैं।

  3. मेरे अनुभव में SELECT INTO का उपयोग आमतौर पर इंटरमीडिएट डेटा सेट के साथ किया जाता है, जैसे #temp टेबल, या बैकअप के लिए पूरी तालिका को कॉपी करने के लिए। INSERT INTO का उपयोग तब किया जाता है जब आप एक ज्ञात संरचना के साथ मौजूदा तालिका में डालते हैं।

संपादित

अपने संपादित करने के लिए, वे अलग अलग बातें करते हैं। यदि आप एक टेबल बना रहे हैं और संरचना को परिभाषित करना चाहते हैं CREATE TABLE और INSERT का उपयोग करें। किसी समस्या का उदाहरण बनाया जा सकता है: आपके पास वर्चर फ़ील्ड के साथ एक छोटी सी टेबल है। आपकी तालिका में सबसे बड़ी स्ट्रिंग अब 12 बाइट्स है। आपके वास्तविक डेटा सेट को 200 बाइट्स की आवश्यकता होगी। यदि आप एक नई चीज बनाने के लिए अपनी छोटी तालिका से SELECT INTO करते हैं, तो बाद में INSERT एक छंटनी त्रुटि के साथ विफल हो जाएगा क्योंकि आपके फ़ील्ड बहुत छोटे हैं।

+3

मेरे दो सेंट, मुझे लगता है कि विफलता शुरू करना एक अच्छी बात है। मैं जानना चाहता हूं कि मेरा डेटा मेरे अपेक्षित डेटा प्रारूप/आकार से मेल नहीं खाता है। मैं हमेशा 'तालिका बनाएं' और फिर 'INSERT INTO' का उपयोग करके अपनी तालिका को परिभाषित करने का प्रयास करता हूं, इसके अलावा, डालने को निष्पादित किए बिना, 'SELECT' कथन का परीक्षण करना आसान है। –

+0

@ डौग - मैं सहमत हूं। मैं लगभग एक विशिष्ट तालिका का उपयोग करने के लिए लगभग 'चयन करें' का उपयोग करता हूं या एक मौजूदा तालिका का त्वरित बैकअप करने के लिए उपयोग करता हूं जिसे मैं बंदरगाह के साथ जा रहा हूं। – JNK

+0

@ जेएनके - बीओएल से, चयन करें चयन सूची में कॉलम के डेटा प्रकारों के आधार पर एक संरचना के साथ एक तालिका बनाता है। तो आपके उदाहरण में आप स्पष्ट रूप से एक आकार के लिए वर्चर कास्टिंग करके स्थिति को सुधार सकते हैं जो पर्याप्त होगा। सही बात? – jowenece

4

प्रत्येक कथन का एक अलग उपयोग केस है। वे विनिमय नहीं कर सकते हैं।

SELECT...INTO MyTable... एक नया MyTable बनाता है जहां कोई पहले मौजूद नहीं था।

INSERT INTO MyTable...SELECT... का उपयोग तब किया जाता है जब MyTable पहले से मौजूद है।

+3

आपने मेरे किसी भी प्रश्न का उत्तर नहीं दिया और मैंने पहले ही आपका जवाब बताया है। – jowenece

+4

आपके प्रश्नों के उत्तर निहित हैं। इसे स्पष्ट करने के लिए, कोई "बेहतर" कथन नहीं है क्योंकि प्रत्येक के पास एक अलग उपयोग केस है। बयान विनिमय करने योग्य नहीं हैं। जब आप एक नई तालिका बनाना चाहते हैं तो पहले संस्करण का उपयोग करें जो मौजूद नहीं है। तालिका पहले से मौजूद होने पर दूसरे संस्करण का उपयोग करें। –

+1

मैं ऐसा क्यों करना चाहता हूं कि एक अस्थायी तालिका बनाकर और फिर इसमें डालना? क्या कोई फायदा है? – jowenece

2

चयन INTO आमतौर पर temp तालिकाओं को उत्पन्न करने के लिए या किसी अन्य तालिका (डेटा और/या संरचना) की प्रतिलिपि बनाने के लिए उपयोग किया जाता है।

आप सम्मिलित उपयोग करें, क्योंकि आपके टेबल पहले से ही पढ़ा जा करने के लिए अद्यतन, नष्ट कर दिया मौजूद होना चाहिए दिन कोड को दिन में, में शामिल हो गए आदि नोट: कीवर्ड में डालने

है कि के साथ वैकल्पिक है, आवेदन पत्र सामान्य रूप से नहीं होगा सामान्य संचालन के हिस्से के रूप में टेबल बनाएं और छोड़ें जब तक कि यह कुछ दायरे सीमित और विशिष्ट उपयोग के लिए एक अस्थायी तालिका न हो।

-चुने जांच के द्वारा बनाई गई कोई भी कुंजी या अनुक्रमित या कोई वास्तविक विपरीत बाधाओं होगा मेज, कायम, पहले से ही मेज

मौजूदा क्योंकि वे उपयोग में लगभग कोई ओवरलैप है 2 सीधे तुलना नहीं की जा

4

प्राथमिक अंतर यह है कि MyTable में चयन परिणाम के साथ MyTable नामक एक नई तालिका तैयार करेगा, जबकि INSERT INTO के लिए आवश्यक है कि MyTable पहले से मौजूद है।

आप केवल उस स्थिति में चयन करें जहां तालिका मौजूद नहीं थी और आप इसे अपनी क्वेरी के परिणामों के आधार पर बनाना चाहते थे। इस प्रकार, ये दो कथन वास्तव में तुलनीय नहीं हैं। वे बहुत अलग चीजें करते हैं।

सामान्य रूप से, चयन INTO को एक से अधिक कार्यों के लिए अक्सर उपयोग किया जाता है, जबकि INSERT INTO नियमित रूप से तालिकाओं को पंक्तियों को जोड़ने के लिए उपयोग किया जाता है।

संपादित करें:
आप टेबल और INSERT INTO बनाएं पूरा करने के लिए क्या चयन में, करता है का चयन के साथ में तालिका परिभाषा पहले से पता करने के लिए की जरूरत नहीं है का उपयोग कर सकते है। चयन करें शायद एसक्यूएल में शामिल है क्योंकि यह विज्ञापन की रिपोर्टिंग या तालिकाओं को कॉपी करना बहुत आसान बनाता है।

4

असल में चयन करें ... में न केवल तालिका बनाता है लेकिन अगर यह पहले से मौजूद है तो असफल हो जाएगा, इसलिए मूल रूप से केवल एक बार जब आप इसका उपयोग करेंगे, तब वह तालिका है जब आप जिस तालिका में सम्मिलित कर रहे हैं वह मौजूद नहीं है।

अपने संपादित करें के बारे में:

मैं व्यक्तिगत रूप से मुख्य रूप से का चयन करें ... जांच का उपयोग जब मैं एक अस्थायी तालिका बनाने रहा हूँ। यह मेरे लिए मुख्य उपयोग है। हालांकि मैं अन्य तालिकाओं के समान संरचनाओं वाले कई स्तंभों के साथ नई तालिकाओं को बनाते समय भी इसका उपयोग करता हूं और फिर समय बचाने के लिए इसे संपादित करता हूं।

+0

मैं मुख्य रूप से टेम्पलेट टेबल के लिए SELECT..INTO के उपयोग भी देखता हूं, लेकिन क्या इसे बनाने के लिए कोई कारण है कि एक CREATE तालिका कथन के साथ एक temp तालिका बनाने पर? जैसे प्रदर्शन लाभ? – jowenece

+1

@jowenece मैं मुख्य रूप से सादगी के लिए सोचता हूं ... यह भी कहें कि आपके पास गतिशील क्वेरी है। मैं संरचना को नहीं जानता, आप हाथ से पहले टेबल नहीं बना सकते हैं, और चयन का उपयोग करना बहुत आसान है ... तालिका को द्विपक्षीय रूप से बनाने से पहले। – AJC

15
  1. कौन सा कथन बेहतर है? आप जो कर रहे हैं उस पर निर्भर करता है।

  2. क्या अन्य प्रदर्शन प्रभाव हैं? यदि तालिका एक स्थायी तालिका है, तो आप तालिका निर्माण के समय अनुक्रमणिका बना सकते हैं जिसमें नकारात्मक और सकारात्मक दोनों प्रदर्शन के लिए प्रभाव पड़ता है। इन्हें मौजूदा टेबल पर मौजूद इंडेक्स को पुन: उत्पन्न नहीं करता है और इस प्रकार तालिका के बाद के उपयोग की आवश्यकता धीमी हो सकती है।

  3. चयन के लिए एक अच्छा उपयोग केस क्या है ... INSERT में ... पर? का चयन करें यदि आप पहले से ही टेबल संरचना को नहीं जानते हैं। तालिका बनाने और एक डालने वाली स्टेमेंट की तुलना में लिखना तेज़ है, इसलिए इसे कभी-कभी अपमानजनक गति के लिए उपयोग किया जाता है। चीजों का परीक्षण करने के लिए त्वरित टेम्प तालिका बनाते समय या किसी विशिष्ट क्वेरी की बैकअप तालिका (शायद रिकॉर्ड जिन्हें आप हटाने जा रहे हैं) का उपयोग करना अक्सर तेज़ होता है।यह उत्पादन कोड में उपयोग करने के लिए दुर्लभ होना चाहिए जो कई बार चलाएगा (अस्थायी तालिकाओं को छोड़कर) क्योंकि तालिका पहले से मौजूद होने पर विफल हो जाएगी।

कभी-कभी उन लोगों द्वारा अनुपयुक्त रूप से उपयोग किया जाता है जो नहीं जानते कि वे क्या कर रहे हैं। और परिणामस्वरूप वे डीबी में विनाश का कारण बन सकते हैं। मुझे दृढ़ता से लगता है कि एक फेंकने वाली तालिका (एक अस्थायी बैकअप, एक अस्थायी तालिका जो संग्रहित प्रो के अंत में दूर चली जाएगी) के अलावा किसी अन्य चीज़ के लिए चयन में उपयोग करना अनुचित है। स्थायी तालिकाओं को वास्तविक विचार उनके डिज़ाइन के रूप में आवश्यक है और चयन करें, जो कुछ भी कॉलम और क्या डेटाटाइप के रूप में बुनियादी के बारे में सोचने से बचना आसान बनाता है।

सामान्य रूप से, मैं निर्माण तालिका और सम्मिलन कथन का उपयोग पसंद करता हूं - आपके पास अधिक नियंत्रण है और यह दोहराने योग्य प्रक्रियाओं के लिए बेहतर है। इसके अलावा, यदि तालिका एक स्थायी तालिका है, तो इसे एक अलग निर्माण तालिका स्क्रिप्ट (जिसे स्रोत नियंत्रण में है) से बनाया जाना चाहिए क्योंकि स्थायी वस्तुओं को बनाना सामान्य रूप से कोड में होना चाहिए जो सम्मिलित/हटाना/अद्यतन या चयन करता है मेज़। ऑब्जेक्ट परिवर्तनों को डेटा परिवर्तनों से अलग से संभाला जाना चाहिए क्योंकि ऑब्जेक्ट्स में विशिष्ट डालने/अपडेट/चयन/हटाए जाने की आवश्यकता से परे प्रभाव पड़ता है। आपको सर्वोत्तम डेटा प्रकारों पर विचार करने की आवश्यकता है, आपको एफके बाधाओं और पीके और अन्य बाधाओं के बारे में सोचना होगा, आपको ऑडिटिंग आवश्यकताओं पर विचार करने की आवश्यकता है, आपको इंडेक्सिंग इत्यादि के बारे में सोचना होगा।

0

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

0

मैं केवल प्रदर्शन से संबंधित प्रश्न के दूसरे बिंदु को कवर करना चाहता हूं, क्योंकि किसी और शरीर ने इसे कवर नहीं किया है। जब बड़े डेटासेट वाले टेबल की बात आती है, तो इसमें डालने से कहीं अधिक तेज होता है। मुझे चुनना पसंद है जब मुझे एक बहुत बड़ी टेबल पढ़नी पड़ेगी। 10 मिलियन पंक्तियों के साथ तालिका में डालने में कुछ मिनट लग सकते हैं, जबकि इसे चुनने में कुछ मिनट लग सकते हैं, और क्योंकि नई तालिका पर इंडेक्स खोने के लिए आप क्वेरी द्वारा इंडेक्स को फिर से बना सकते हैं और तुलना में बहुत अधिक समय बचा सकते हैं में डालें।

+0

यह सच है, लेकिन यह ज्यादातर इसलिए है क्योंकि SQL सर्वर जानता है कि गंतव्य तालिका के लिए कोई विवाद नहीं है। 'Temp के साथ # temock में डालने के लिए प्रदर्शन * से चुनें *' लगभग * चुनिंदा * के लिए प्रदर्शन के रूप में प्रदर्शन के समान है ... ' – Brian

-1

बड़े डेटासेट के लिए चयन करें केवल एक उपयोगकर्ता के लिए अच्छा हो सकता है जो डेटाबेस के लिए एक एकल कनेक्शन का उपयोग कर थोक ऑपरेशन कार्य कर रहा है। मैं के रूप में यह एक बड़ा लेन-देन बनाता है और वस्तु बनाने के लिए स्कीमा ताला बनाता है, जब तक SELECT INTO आपरेशन पूरा करता वस्तु या एक्सेस सिस्टम वस्तुओं को बनाने के अन्य उपयोगकर्ताओं को रोकने

SELECT * INTO table 

उपयोग करने के लिए सलाह नहीं देते।

अवधारणा खुला 2 सत्रों के सबूत, पहले सत्र कोशिश में

select into temp table from a huge table 

और उपयोग करने के लिए के रूप में दूसरे खंड में

create a temp table 

करने के लिए और कोशिश करते हैं और ताले की जाँच करें, अवरुद्ध दूसरे की अवधि एक temp तालिका वस्तु बनाने के लिए सत्र। मेरे सिफारिश यह हमेशा बना सकते हैं और बयान डालें एक अच्छा अभ्यास है और अगर कम से कम लॉगिंग उपयोग ट्रेस ध्वज के लिए आवश्यक 610

0

चयन में और में सम्मिलित बीच सरल अंतर है: -> में चयन मौजूदा जरूरत नहीं है तालिका। यदि आप तालिका ए डेटा की प्रतिलिपि बनाना चाहते हैं, तो आप ए से चुनें * INTO [tablename] टाइप करें।यहां, tablename मौजूदा तालिका हो सकती है या नई तालिका बनाई जाएगी जिसमें तालिका ए

-> मौजूदा तालिका की आवश्यकता है। INSERT [tablename] चुनें * से चुनें; यहां tablename एक मौजूदा तालिका है।

डेटा का चयन करने के लिए आम तौर पर अधिक लोकप्रिय है विशेष रूप से बैकअप डेटा।

आप अपनी आवश्यकता के अनुसार उपयोग कर सकते हैं, यह पूरी तरह से डेवलपर पसंद है जिसका उपयोग अपने परिदृश्य में किया जाना चाहिए।

प्रदर्शन के अनुसार आईएनटीओ डालें तेज़ है।

संदर्भ:

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp

संबंधित मुद्दे