स्कीमा परिवर्तन
- क्रम से लाएं --- यदि कोड डेटा प्राप्त करने के तरीके के रूप में # कॉलम ला रहा है, तो स्कीमा में बदलाव कॉलम संख्या को पुन: अन्याय का कारण बनेगा। इससे एप्लिकेशन गड़बड़ हो जाएगा और खराब चीजें होंगी।
- नाम से प्राप्त करें --- यदि कोड नाम से स्तंभ ला रहा है
foo
, और क्वेरी में एक अन्य तालिका एक स्तंभ जोड़ता है foo
, तो जिस तरह से इसे संभाला जाता है, वह सही foo
स्तंभ प्राप्त करने का प्रयास करते समय समस्याएं पैदा कर सकता है ।
किसी भी तरह से, एक स्कीमा परिवर्तन डेटा के निष्कर्षण के साथ समस्याएं पैदा कर सकता है।
आगे विचार करें कि क्या उपयोग किया जा रहा एक स्तंभ तालिका से निकाल दिया गया है। select * from ...
अभी भी लेकिन त्रुटियों बाहर काम करता है जब परिणाम सेट से बाहर डेटा खींचने की कोशिश कर। यदि कॉलम क्वेरी में निर्दिष्ट किया गया है, तो क्वेरी स्पष्ट रूप से संकेत देगी कि समस्या क्या है और कहां है।
डेटा ओवरहेड
कुछ स्तंभों में उनके साथ जुड़ी महत्वपूर्ण मात्रा में डेटा हो सकता है। वापस चयन करने *
से सारा डेटा खिंच जाएगा । हाँ, यहाँ है कि varchar(4096)
1000 पंक्तियों पर thats कि तुम वापस चुना है आप डेटा की एक अतिरिक्त संभव 4 मेगाबाइट है कि आप की जरूरत नहीं दे रहे हैं, लेकिन तार वैसे भी भेजा जाता है।
स्कीमा परिवर्तन से संबंधित है, कि जब आप पहली बार तालिका बनाते हैं, तो यह वहां मौजूद नहीं हो सकता है, लेकिन अब वहां है।
आशय व्यक्त करने में विफलता
जब आप वापस चुनते हैं *
और 20 कॉलम प्राप्त करते हैं, लेकिन उनमें से केवल 2 की आवश्यकता होती है, तो आप कोड का इरादा नहीं बता रहे हैं। जब कोई ऐसा प्रश्न देखता है select *
जो यह नहीं जानता है कि इसके महत्वपूर्ण भाग क्या हैं। क्या मैं इन स्तंभों को शामिल करके इसे तेज़ी से बनाने के बजाय इस अन्य योजना का उपयोग करने के लिए क्वेरी बदल सकता हूं? मुझे नहीं पता क्योंकि क्वेरी रिटर्न का इरादा स्पष्ट नहीं है।
कुछ SQL फ़िडल्स पर नज़र डालते हैं जो उन स्कीमा का पता लगाते हैं जो थोड़ा और बदल जाते हैं।
सबसे पहले, प्रारंभिक डेटाबेस: http://sqlfiddle.com/#/2/a67dd/1
DDL:
create table one (oneid int, data int, twoid int);
create table two (twoid int, other int);
insert into one values (1, 42, 2);
insert into two values (2, 43);
एसक्यूएल:
select * from one join two on (one.twoid = two.twoid);
और कॉलम आप वापस पाने के हैं oneid=1
, data=42
, twoid=2
, और other=43
।
अब, यदि मैं तालिका एक में एक स्तंभ जोड़ दूं तो क्या होगा? http://sqlfiddle.com/#!2/cd0b0/1
alter table one add column other text;
update one set other = 'foo';
और एक ही क्वेरी से अपने परिणाम के रूप में पहले कर रहे हैं oneid=1
, data=42
, twoid=2
, और other=foo
।
तालिकाओं में से एक में परिवर्तन एक के मानों को बाधित करता है select *
और अचानक एक अन्य के लिए 'अन्य' के अपने बंधन को एक त्रुटि फेंकने वाला है और आपको पता नहीं क्यों।
अगर इसके बजाय आपका SQL स्टेटमेंट था
select
one.oneid, one.data, two.twoid, two.other
from one join two on (one.twoid = two.twoid);
तालिका एक में परिवर्तन से आपका डेटा बाधित नहीं होगा। वह क्वेरी परिवर्तन से पहले और परिवर्तन के बाद भी चलती है।
इंडेक्सिंग
जब आप करते हैं तो select * from
आप सभी पंक्तियों को खींच रहे होते हैं जो सभी तालिकाओं को बनाते हैं जो स्थितियों से मेल खाते हैं। यहां तक कि तालिकाओं के बारे में आप वास्तव में परवाह नहीं करते हैं। जबकि इसका मतलब है कि अधिक डेटा स्थानांतरित हो गया है, स्टैक के नीचे एक और प्रदर्शन समस्या है जो आगे झुक रही है।
इंडेक्स। (SO पर संबंधित: चुनिंदा स्टेटमेंट में इंडेक्स का उपयोग कैसे करें? )
यदि आप बहुत सारे कॉलम वापस खींच रहे हैं, तो डेटाबेस प्लान ऑप्टिमाइज़र एक इंडेक्स का उपयोग करके अवहेलना कर सकता है क्योंकि आपको अभी भी उन सभी कॉलमों को लाने की आवश्यकता है और इंडेक्स का उपयोग करने में अधिक समय लगेगा और फिर क्वेरी में सभी कॉलम लाने होंगे। की तुलना में यह सिर्फ एक पूर्ण टेबल स्कैन करने के लिए होगा।
यदि आप केवल एक उपयोगकर्ता का अंतिम नाम, कहते हैं, का चयन कर रहे हैं (जो आप बहुत कुछ करते हैं और इस पर एक सूचकांक है), डेटाबेस केवल एक सूचकांक स्कैन कर सकता है ( केवल विकि स्कैन सूचकांक को स्कैन करता है , mysql पूर्ण तालिका स्कैन बनाम पूर्ण इंडेक्स स्कैन , इंडेक्स-ओनली स्कैन: टेबल एक्सेस से बचना )।
यदि संभव हो तो केवल अनुक्रमित से पढ़ने के बारे में काफी अनुकूलन है। जानकारी को प्रत्येक अनुक्रमणिका पृष्ठ पर तेजी से खींचा जा सकता है क्योंकि आप इसे भी कम खींच रहे हैं - आप उन सभी अन्य स्तंभों में नहीं खींच रहे हैं select *
। सूचकांक के लिए यह संभव है कि केवल 100x तेज़ी के क्रम पर परिणाम वापस करने के लिए स्कैन करें (स्रोत: चुनें * खराब है )।
यह नहीं कह रहा है कि एक पूर्ण सूचकांक स्कैन महान है, यह अभी भी एक पूर्ण स्कैन है - लेकिन यह एक पूर्ण तालिका स्कैन से बेहतर है। एक बार जब आप उन सभी तरीकों का पीछा करना शुरू कर देते हैं जो select *
प्रदर्शन को नुकसान पहुंचाते हैं तो आप नए खोजते रहते हैं।
संबंधित पढ़ना