एप्लिकेशन डेवलपर्स द्वारा की गई सामान्य डेटाबेस डेवलपमेंट गलतियाँ क्या हैं?
एप्लिकेशन डेवलपर्स द्वारा की गई सामान्य डेटाबेस डेवलपमेंट गलतियाँ क्या हैं?
जवाबों:
1. उपयुक्त सूचकांकों का उपयोग नहीं करना
यह अपेक्षाकृत आसान है, लेकिन फिर भी यह हर समय होता है। विदेशी कुंजी उन पर अनुक्रमित होनी चाहिए। यदि आप एक क्षेत्र का उपयोग कर रहे हैं, तो आपको WHERE
(शायद) उस पर एक सूचकांक होना चाहिए। इस तरह के सूचकांक को अक्सर आपके द्वारा निष्पादित किए जाने वाले प्रश्नों के आधार पर कई स्तंभों को कवर करना चाहिए।
2. संदर्भात्मक अखंडता को लागू नहीं करना
आपका डेटाबेस यहां भिन्न हो सकता है, लेकिन यदि आपका डेटाबेस संदर्भात्मक अखंडता का समर्थन करता है - जिसका अर्थ है कि सभी विदेशी कुंजी मौजूद हैं जो एक इकाई को इंगित करने की गारंटी है - आपको इसका उपयोग करना चाहिए।
MySQL डेटाबेस पर इस विफलता को देखना काफी आम है। मुझे विश्वास नहीं होता कि MyISAM इसका समर्थन करता है। InnoDB करता है। आपको ऐसे लोग मिलेंगे जो MyISAM का उपयोग कर रहे हैं या जो InnoDB का उपयोग कर रहे हैं, लेकिन वैसे भी इसका उपयोग नहीं कर रहे हैं।
यहां अधिक:
3. सरोगेट (तकनीकी) प्राथमिक कुंजी के बजाय प्राकृतिक का उपयोग करना
प्राकृतिक कुंजियाँ बाहरी अर्थपूर्ण डेटा पर आधारित कुंजियाँ हैं जो (ओस्टेंसिक रूप से) अद्वितीय हैं। सामान्य उदाहरण उत्पाद कोड, दो-अक्षर राज्य कोड (यूएस), सामाजिक सुरक्षा संख्या और इतने पर हैं। सरोगेट या तकनीकी प्राथमिक कुंजी वे हैं जिनका सिस्टम के बाहर कोई अर्थ नहीं है। वे पूरी तरह से इकाई की पहचान के लिए आविष्कार किए जाते हैं और आमतौर पर ऑटो-इन्क्रिमेंटिंग फ़ील्ड (SQL सर्वर, MySQL, अन्य) या अनुक्रम (सबसे विशेष रूप से ओरेकल) हैं।
मेरी राय में आपको हमेशा सरोगेट की का उपयोग करना चाहिए । इन सवालों में यह मुद्दा सामने आया है:
यह कुछ हद तक विवादास्पद विषय है जिस पर आपको सार्वभौमिक सहमति नहीं मिलेगी। जब आप कुछ लोगों को मिल सकते हैं, जो सोचते हैं कि प्राकृतिक कुंजी कुछ स्थितियों में ठीक है, तो आपको यकीनन अनावश्यक होने के अलावा सरोगेट कुंजी की कोई आलोचना नहीं मिलेगी। अगर आप मुझसे पूछें तो यह काफी छोटा है।
याद रखें, यहां तक कि देश भी अस्तित्व में नहीं रह सकते हैं (उदाहरण के लिए, यूगोस्लाविया)।
4. DISTINCT
काम करने के लिए आवश्यक क्वेरी लिखना
आप अक्सर इसे ORM- जनरेट किए गए प्रश्नों में देखते हैं। हाइबरनेट से लॉग आउटपुट को देखें और आप देखेंगे कि सभी प्रश्न निम्नलिखित हैं:
SELECT DISTINCT ...
यह सुनिश्चित करने के लिए कि आप डुप्लिकेट पंक्तियों को वापस न करें और इस प्रकार डुप्लिकेट ऑब्जेक्ट प्राप्त करें, यह एक शॉर्टकट है। आप कभी-कभी लोगों को ऐसा करते हुए देखेंगे। यदि आप इसे बहुत अधिक देखते हैं तो यह एक वास्तविक लाल झंडा है। ऐसा नहीं है कि DISTINCT
बुरा है या वैध आवेदन नहीं है। यह (दोनों मायने रखता है) करता है लेकिन यह सही प्रश्न लिखने के लिए सरोगेट या स्टॉपगैप नहीं है।
क्यों मैं नफरत से नफरत करता हूँ :
जहां चीजें मेरी राय में खट्टी होने लगती हैं, जब एक डेवलपर पर्याप्त क्वेरी का निर्माण कर रहा है, एक साथ तालिकाओं में शामिल हो रहा है, और अचानक उसे पता चलता है कि ऐसा लगता है कि वह डुप्लिकेट (या इससे भी अधिक) पंक्तियों और उसकी तत्काल प्रतिक्रिया कर रहा है ... इस "समस्या" के लिए उसका "समाधान" DISTINCT कीवर्ड पर फेंकना है और POOF उसकी सभी परेशानियों को दूर कर देता है।
5. जॉइनिंग से अधिक एग्रीगेशन
डेटाबेस एप्लिकेशन डेवलपर्स द्वारा एक और सामान्य गलती यह महसूस नहीं करना है कि कितना महंगा एकत्रीकरण (यानी GROUP BY
क्लॉज) की तुलना जॉइन की जा सकती है।
आपको यह अनुमान लगाने के लिए कि यह कितना व्यापक है, मैंने इस विषय पर कई बार यहां लिखा है और इसके लिए बहुत कुछ लिखा गया है। उदाहरण के लिए:
से SQL विवरण - "द्वारा और होने समूह" बनाम "में शामिल होने" :
पहली क्वेरी:
SELECT userid FROM userrole WHERE roleid IN (1, 2, 3) GROUP by userid HAVING COUNT(1) = 3
क्वेरी समय: 0.312 एस
दूसरी क्वेरी:
SELECT t1.userid FROM userrole t1 JOIN userrole t2 ON t1.userid = t2.userid AND t2.roleid = 2 JOIN userrole t3 ON t2.userid = t3.userid AND t3.roleid = 3 AND t1.roleid = 1
क्वेरी समय: 0.016 एस
ये सही है। जो संस्करण मैंने प्रस्तावित किया वह कुल संस्करण की तुलना में बीस गुना तेज है।
6. विचारों के माध्यम से जटिल प्रश्नों को सरल नहीं करना
सभी डेटाबेस विक्रेता विचारों का समर्थन नहीं करते हैं लेकिन जो करते हैं, वे विवेकपूर्ण तरीके से उपयोग किए जाने पर प्रश्नों को सरल बना सकते हैं। उदाहरण के लिए, एक परियोजना पर मैंने सीआरएम के लिए एक सामान्य पार्टी मॉडल का उपयोग किया । यह एक अत्यंत शक्तिशाली और लचीली मॉडलिंग तकनीक है लेकिन इससे कई जुड़ाव हो सकते हैं। इस मॉडल में थे:
उदाहरण:
इसलिए टेड को अपने नियोक्ता से जोड़ने के लिए पांच तालिकाओं को जोड़ा गया है। आप मानते हैं कि सभी कर्मचारी व्यक्ति हैं (संगठन नहीं) और यह सहायक दृश्य प्रदान करते हैं:
CREATE VIEW vw_employee AS
SELECT p.title, p.given_names, p.surname, p.date_of_birth, p2.party_name employer_name
FROM person p
JOIN party py ON py.id = p.id
JOIN party_role child ON p.id = child.party_id
JOIN party_role_relationship prr ON child.id = prr.child_id AND prr.type = 'EMPLOYMENT'
JOIN party_role parent ON parent.id = prr.parent_id = parent.id
JOIN party p2 ON parent.party_id = p2.id
और अचानक आपके पास इच्छित डेटा का एक बहुत ही सरल दृश्य है लेकिन एक अत्यधिक लचीले डेटा मॉडल पर।
7. इनपुट का सैनिटाइजेशन नहीं
यह बहुत बड़ा है। अब मुझे PHP पसंद है, लेकिन अगर आप नहीं जानते कि आप क्या कर रहे हैं तो हमला करने के लिए साइटों को बनाना आसान है। कुछ भी नहीं यह छोटे बॉबी टेबल्स की कहानी से बेहतर है ।
उपयोगकर्ता द्वारा URL, फ़ॉर्म डेटा और कुकीज़ के माध्यम से दिए गए डेटा को हमेशा शत्रुतापूर्ण और स्वच्छता के रूप में माना जाना चाहिए। सुनिश्चित करें कि आप वह कर रहे हैं जो आप उम्मीद करते हैं।
8. तैयार कथनों का उपयोग नहीं करना
तैयार किए गए बयान तब होते हैं जब आप एक क्वेरी माइनस को आवेषण, अपडेट और WHERE
क्लॉज़ में उपयोग किए गए डेटा को संकलित करते हैं और फिर बाद में आपूर्ति करते हैं। उदाहरण के लिए:
SELECT * FROM users WHERE username = 'bob'
बनाम
SELECT * FROM users WHERE username = ?
या
SELECT * FROM users WHERE username = :username
आपके प्लेटफॉर्म पर निर्भर करता है
मैंने डेटाबेस को ऐसा करके अपने घुटनों पर लाया है। मूल रूप से, हर बार कोई भी आधुनिक डेटाबेस एक नई क्वेरी का सामना करता है जिसे उसे संकलित करना होता है। यदि यह पहले देखी गई किसी क्वेरी का सामना करता है, तो आप डेटाबेस को संकलित क्वेरी और निष्पादन योजना को कैश करने का अवसर दे रहे हैं। क्वेरी को बहुत कुछ करने से आप डेटाबेस को यह पता लगाने का अवसर दे रहे हैं कि और उसके अनुसार अनुकूलित करें (उदाहरण के लिए, स्मृति में संकलित क्वेरी को पिन करके)।
तैयार किए गए कथनों का उपयोग करने से आपको इस बारे में सार्थक आंकड़े मिलेंगे कि कुछ प्रश्नों का उपयोग कितनी बार किया जाता है।
तैयार किए गए बयान भी SQL इंजेक्शन के हमलों से आपकी रक्षा करेंगे।
9. पर्याप्त सामान्य नहीं
डेटाबेस सामान्यीकरण मूल रूप से डेटाबेस डिजाइन के अनुकूलन की प्रक्रिया है या आप अपने डेटा को तालिकाओं में कैसे व्यवस्थित करते हैं।
बस इस हफ्ते मैं कुछ कोड भर गया, जहां किसी ने एक सरणी को फंसाया था और इसे एक डेटाबेस में एक ही क्षेत्र में डाला था। सामान्य करना उस सरणी के तत्व को एक बच्चे की तालिका में एक अलग पंक्ति के रूप में माना जाएगा (यानी एक-से-कई संबंध)।
उपयोगकर्ता आईडी की सूची संग्रहीत करने के लिए यह सर्वोत्तम विधि में आया :
मैंने अन्य प्रणालियों में देखा है कि सूची क्रमबद्ध PHP सरणी में संग्रहीत है।
लेकिन सामान्यीकरण की कमी कई रूपों में आती है।
अधिक:
10. बहुत अधिक सामान्य करना
यह पिछले बिंदु पर एक विरोधाभास की तरह लग सकता है लेकिन सामान्यीकरण, कई चीजों की तरह, एक उपकरण है। यह अंत का एक साधन है और स्वयं का अंत नहीं है। मुझे लगता है कि कई डेवलपर्स इसे भूल जाते हैं और "साधन" को "अंत" के रूप में मानने लगते हैं। यूनिट परीक्षण इसका एक प्रमुख उदाहरण है।
मैंने एक बार एक ऐसी प्रणाली पर काम किया था जिसमें ग्राहकों के लिए एक बहुत बड़ा पदानुक्रम था जो कुछ इस तरह था:
Licensee -> Dealer Group -> Company -> Practice -> ...
इससे पहले कि आपको कोई सार्थक डेटा मिल सके उससे पहले आपको लगभग 11 तालिकाओं के साथ जुड़ना होगा। यह सामान्यीकरण का बहुत अच्छा उदाहरण था जो बहुत दूर तक ले जाया गया था।
इस बिंदु पर अधिक, सावधान और माना जाता है कि अपभ्रंश से भारी प्रदर्शन लाभ हो सकता है लेकिन ऐसा करते समय आपको वास्तव में सावधान रहना होगा।
अधिक:
11. अनन्य आर्क्स का उपयोग करना
एक अनन्य चाप एक सामान्य गलती है जहां एक तालिका दो या अधिक विदेशी कुंजियों के साथ बनाई जाती है जहां एक और उनमें से केवल एक ही गैर-शून्य हो सकती है। बड़ी गलती। एक बात के लिए डेटा की अखंडता को बनाए रखना बहुत कठिन हो जाता है। सब के बाद, यहां तक कि संदर्भात्मक अखंडता के साथ, कुछ भी नहीं है इन दो या अधिक विदेशी कुंजियों को सेट होने से रोक रहा है (जटिल चेक बाधाओं के बावजूद)।
से रिलेशनल डेटाबेस डिजाइन ए प्रैक्टिकल गाइड :
हमने जहां भी संभव हो, अनन्य आर्क निर्माण के खिलाफ दृढ़ता से सलाह दी है, इस कारण से कि वे कोड लिखने और अधिक रखरखाव कठिनाइयों को रोकने के लिए अजीब हो सकते हैं।
12. प्रश्नों पर प्रदर्शन विश्लेषण बिल्कुल नहीं करना
व्यावहारिकता सर्वोच्च रूप से डेटाबेस की दुनिया में शासन करती है। यदि आप सिद्धांतों से इस बात पर चिपके रहते हैं कि वे हठधर्मिता हो गए हैं तो आपने शायद गलतियाँ की हैं। ऊपर से कुल प्रश्नों का उदाहरण लें। कुल संस्करण "अच्छा" लग सकता है, लेकिन इसका प्रदर्शन बहुत बुरा है। एक प्रदर्शन की तुलना ने बहस को समाप्त कर दिया (लेकिन यह नहीं था) लेकिन इस बिंदु पर और अधिक: पहली बार में इस तरह के बीमार सूचित विचारों को टालना अज्ञानी, यहां तक कि खतरनाक है।
13. UNION ALL और विशेष रूप से UNION निर्माण पर निर्भरता
SQL शब्दों में एक UNION केवल बधाई डेटा सेट को समेटता है, जिसका अर्थ है कि उनके समान प्रकार और कॉलम की संख्या है। उनके बीच का अंतर यह है कि UNION ALL एक सरल समवशरण है और जहाँ भी संभव हो इसे पसंद किया जाना चाहिए, जबकि UNION नकली डुप्लिकेट को हटाने के लिए DISTINCT करेगा।
UNISTs, जैसे DISTINCT का अपना स्थान है। वैध आवेदन हैं। लेकिन अगर आप खुद को उनमें से बहुत कुछ करते हुए पाते हैं, विशेष रूप से उपश्रेणियों में, तो आप शायद कुछ गलत कर रहे हैं। यह खराब क्वेरी निर्माण या खराब डिज़ाइन किए गए डेटा मॉडल का मामला हो सकता है जो आपको ऐसी चीजें करने के लिए मजबूर करता है।
UNIONs, विशेष रूप से जब जोड़ या आश्रित उपश्रेणियों में उपयोग किया जाता है, एक डेटाबेस को अपंग कर सकता है। जब भी संभव हो उनसे बचने की कोशिश करें।
14. प्रश्नों में OR शर्तों का उपयोग करना
यह हानिरहित लग सकता है। आखिरकार, ANDs ठीक हैं। या ठीक भी होना चाहिए? गलत। मूल रूप से AND स्थिति डेटा सेट को प्रतिबंधित करती है जबकि OR स्थिति इसे बढ़ाती है लेकिन इस तरह से नहीं जो स्वयं को अनुकूलन के लिए उधार देती है। विशेष रूप से जब विभिन्न या शर्तें इस प्रकार परिणाम के लिए DISTINCT ऑपरेशन के लिए प्रभावी रूप से अनुकूलक का उपयोग करने के लिए मजबूर कर सकती हैं।
खराब:
... WHERE a = 2 OR a = 5 OR a = 11
बेहतर:
... WHERE a IN (2, 5, 11)
अब आपका SQL ऑप्टिमाइज़र पहली क्वेरी को प्रभावी रूप से दूसरे में बदल सकता है। लेकिन यह नहीं हो सकता है। बस यह मत करो।
15. अपने डेटा मॉडल को उच्च प्रदर्शन वाले समाधानों के लिए उधार देने के लिए नहीं
यह परिमाण करने के लिए एक कठिन बिंदु है। यह आमतौर पर इसके प्रभाव से मनाया जाता है। यदि आप अपने आप को अपेक्षाकृत सरल कार्यों के लिए स्पष्ट रूप से प्रश्न लिख रहे हैं या अपेक्षाकृत सरल जानकारी खोजने के लिए प्रश्न कुशल नहीं हैं, तो संभवतः आपके पास एक खराब डेटा मॉडल है।
कुछ मायनों में यह बिंदु पहले वाले सभी को सारांशित करता है, लेकिन यह एक सावधानी की कहानी है कि क्वेरी ऑप्टिमाइज़ेशन जैसी चीजें करना अक्सर पहले किया जाता है जब इसे दूसरा किया जाना चाहिए। प्रदर्शन को अनुकूलित करने की कोशिश करने से पहले सबसे पहले और आपको यह सुनिश्चित करना चाहिए कि आपके पास एक अच्छा डेटा मॉडल है। जैसा कि नुथ ने कहा:
सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है
16. डेटाबेस लेनदेन का गलत उपयोग
किसी विशिष्ट प्रक्रिया के लिए सभी डेटा परिवर्तन परमाणु होने चाहिए। यानी यदि ऑपरेशन सफल हो जाता है, तो यह पूरी तरह से करता है। यदि यह विफल रहता है, तो डेटा को अपरिवर्तित छोड़ दिया जाता है। - 'आधे-अधूरे' बदलाव की संभावना नहीं होनी चाहिए।
आदर्श रूप से, इसे प्राप्त करने का सबसे सरल तरीका यह है कि संपूर्ण सिस्टम डिज़ाइन एकल INSERT / UPDATE / DELETE कथनों के माध्यम से सभी डेटा परिवर्तनों का समर्थन करने का प्रयास करे। इस मामले में, किसी विशेष लेनदेन से निपटने की आवश्यकता नहीं है, क्योंकि आपके डेटाबेस इंजन को स्वचालित रूप से ऐसा करना चाहिए।
हालांकि, अगर किसी भी प्रक्रिया के लिए डेटा को एक सुसंगत स्थिति में रखने के लिए एक इकाई के रूप में कई बयानों की आवश्यकता होती है, तो उचित लेनदेन नियंत्रण आवश्यक है।
अपने डेटाबेस कनेक्टिविटी लेयर, और डेटाबेस इंजन से इस संबंध में बातचीत कैसे करें, इसकी उप-पट्टियों पर सावधानीपूर्वक ध्यान देने की सिफारिश की गई है।
17. 'सेट-बेस्ड' प्रतिमान को नहीं समझना
SQL भाषा विशिष्ट प्रकार की समस्याओं के अनुकूल एक विशिष्ट प्रतिमान का अनुसरण करती है। विभिन्न विक्रेता-विशिष्ट एक्सटेंशन के बावजूद, भाषा उन समस्याओं से निपटने के लिए संघर्ष करती है जो जावा, सी #, डेल्फी आदि जैसे तुच्छ क्षेत्रों में हैं।
यह समझ की कमी कुछ तरीकों से प्रकट होती है।
जिम्मेदारी का स्पष्ट विभाजन निर्धारित करें, और प्रत्येक समस्या को हल करने के लिए उपयुक्त उपकरण का उपयोग करने का प्रयास करें।
डेवलपर्स द्वारा किए गए कुंजी डेटाबेस डिज़ाइन और प्रोग्रामिंग गलतियाँ
स्वार्थी डेटाबेस डिजाइन और उपयोग। डेवलपर्स अक्सर डेटा में अन्य हितधारकों की जरूरतों पर विचार किए बिना डेटाबेस को अपने व्यक्तिगत लगातार ऑब्जेक्ट स्टोर के रूप में मानते हैं। यह एप्लिकेशन आर्किटेक्ट पर भी लागू होता है। खराब डेटाबेस डिजाइन और डेटा अखंडता डेटा के साथ काम करने वाले तीसरे पक्ष के लिए कठिन बनाता है और सिस्टम के जीवन चक्र की लागत को काफी हद तक बढ़ा सकता है। रिपोर्टिंग और एमआईएस आवेदन डिजाइन में एक गरीब चचेरे भाई हो जाते हैं और केवल बाद में किया जाता है।
असामान्य डेटा का दुरुपयोग करना। अपभ्रंश डेटा को ओवरडोज़ करना और अनुप्रयोग के भीतर इसे बनाए रखने की कोशिश करना डेटा अखंडता मुद्दों के लिए एक नुस्खा है। हर तरह के प्रयोग करें। क्वेरी में शामिल होने के लिए नहीं जोड़ना चाहने वाले के लिए एक बहाना नहीं है।
SQL लिखने से डरना। एसक्यूएल रॉकेट विज्ञान नहीं है और वास्तव में अपना काम करने में काफी अच्छा है। ओ / आर मैपिंग परतें 95% क्वेरी करने में काफी अच्छी हैं जो सरल और उस मॉडल में अच्छी तरह से फिट हैं। कभी-कभी SQL काम करने का सबसे अच्छा तरीका है।
डॉगमैटिक 'नो स्टोर्ड प्रोसीजर' की नीतियां। भले ही आप मानते हैं कि संग्रहीत प्रक्रियाएं बुराई हैं, इस तरह के हठधर्मिता रवैये का सॉफ़्टवेयर प्रोजेक्ट पर कोई स्थान नहीं है।
डेटाबेस डिज़ाइन को नहीं समझना। सामान्यीकरण आपका मित्र है और यह रॉकेट साइंस नहीं है। जॉइनिंग और कार्डिनैलिटी काफी सरल अवधारणाएं हैं - यदि आप डेटाबेस एप्लिकेशन डेवलपमेंट में शामिल हैं, तो उन्हें न समझने के लिए वास्तव में कोई बहाना नहीं है।
संग्रहीत प्रक्रियाओं पर अधिक उपयोग और / या निर्भरता।
कुछ एप्लिकेशन डेवलपर्स संग्रहीत प्रक्रियाओं को मध्य स्तरीय / फ्रंट एंड कोड के प्रत्यक्ष विस्तार के रूप में देखते हैं। यह Microsoft स्टैक डेवलपर्स में एक सामान्य लक्षण प्रतीत होता है, (मैं एक हूं, लेकिन मैं इससे बाहर हो गया हूं) और कई संग्रहीत कार्यविधियों का निर्माण करता है जो जटिल व्यावसायिक तर्क और वर्कफ़्लो प्रसंस्करण करते हैं। यह कहीं और बेहतर है।
संग्रहीत प्रक्रियाएं उपयोगी हैं जहां यह वास्तव में साबित हो गया है कि कुछ वास्तविक तकनीकी कारक उनके उपयोग (उदाहरण के लिए, प्रदर्शन और सुरक्षा) की आवश्यकता है उदाहरण के लिए, बड़े डेटा सेटों को "डेटा के करीब" एकत्र करना / फ़िल्टर करना।
मुझे हाल ही में एक बड़े डेल्फी डेस्कटॉप एप्लिकेशन को बनाए रखने और बढ़ाने में मदद करनी थी, जिसमें 70% व्यापार तर्क और नियम 1400 SQL सर्वर संग्रहीत प्रक्रियाओं (UI इवेंट हैंडलर में शेष) में लागू किए गए थे। यह एक बुरा सपना था, मुख्य रूप से TSQL के लिए प्रभावी इकाई परीक्षण शुरू करने के अंतर के कारण, इनकैप्सुलेशन की कमी और खराब उपकरण (डीबगर्स, संपादक)।
अतीत में एक जावा टीम के साथ काम करने से मुझे जल्दी से पता चला कि अक्सर उस वातावरण में पूर्ण विपरीत पकड़ होती है। एक जावा वास्तुकार ने एक बार मुझसे कहा था: "डेटाबेस डेटा के लिए है, कोड नहीं।"
इन दिनों मुझे लगता है कि संग्रहीत प्रोक्स पर विचार न करना एक गलती है, लेकिन उन्हें उन स्थितियों में संयम से इस्तेमाल किया जाना चाहिए (डिफ़ॉल्ट रूप से नहीं) जहां वे उपयोगी लाभ प्रदान करते हैं (अन्य उत्तर देखें)।
नंबर एक समस्या? वे केवल खिलौना डेटाबेस पर परीक्षण करते हैं। इसलिए उन्हें इस बात का कोई अंदाजा नहीं है कि डेटाबेस बड़ा होने पर उनकी एसक्यूएल क्रॉल हो जाएगी, और किसी को साथ आना होगा और बाद में इसे ठीक करना होगा (यह ध्वनि आप सुन सकते हैं कि मेरे दांत पीस रहे हैं)।
अनुक्रमित का उपयोग नहीं कर रहा है।
खराब प्रदर्शनों के कारण खराब प्रदर्शन
अधिकांश समय आप सहसंबंधित उप-श्रेणियों से बचना चाहते हैं। एक सबक्वेरी को सहसंबंधित किया जाता है, यदि सबक्वेरी के भीतर, बाहरी क्वेरी से एक कॉलम का संदर्भ होता है। जब ऐसा होता है, तो हर पंक्ति के लिए कम से कम एक बार सबक्वेरी को निष्पादित किया जाता है और अधिक बार निष्पादित किया जा सकता है यदि अन्य शर्तें लागू की जाती हैं, तो सहसंबद्ध उपश्रेणी वाली स्थिति लागू होने के बाद।
आकस्मिक उदाहरण और ओरेकल सिंटैक्स को माफ़ कर दें, लेकिन मान लें कि आप उन सभी कर्मचारियों को ढूंढना चाहते हैं जिन्हें आपके किसी भी स्टोर में रखा गया है क्योंकि पिछली बार स्टोर ने एक दिन में $ 10,000 से कम बिक्री की थी।
select e.first_name, e.last_name
from employee e
where e.start_date >
(select max(ds.transaction_date)
from daily_sales ds
where ds.store_id = e.store_id and
ds.total < 10000)
इस उदाहरण में उपश्रेणी store_id द्वारा बाहरी क्वेरी से संबंधित है और आपके सिस्टम के प्रत्येक कर्मचारी के लिए निष्पादित की जाएगी। एक तरीका है कि इस क्वेरी को अनुकूलित किया जा सकता है कि एक इनलाइन-व्यू में सबक्वेरी को स्थानांतरित करना है।
select e.first_name, e.last_name
from employee e,
(select ds.store_id,
max(s.transaction_date) transaction_date
from daily_sales ds
where ds.total < 10000
group by s.store_id) dsx
where e.store_id = dsx.store_id and
e.start_date > dsx.transaction_date
इस उदाहरण में, क्लॉज से क्वेरी अब एक इनलाइन-व्यू (फिर से कुछ ओरेकल विशिष्ट वाक्यविन्यास) है और इसे केवल एक बार निष्पादित किया जाता है। आपके डेटा मॉडल के आधार पर, यह क्वेरी संभवतः बहुत तेज़ी से निष्पादित होगी। कर्मचारियों की संख्या बढ़ने पर यह पहली क्वेरी से बेहतर प्रदर्शन करेगा। कुछ कर्मचारियों और कई दुकानों (और शायद कई दुकानों में कोई कर्मचारी नहीं थे) और daily_sales तालिका store_id पर अनुक्रमित होने पर पहली क्वेरी वास्तव में बेहतर प्रदर्शन कर सकती थी। यह एक संभावना परिदृश्य नहीं है, लेकिन दिखाता है कि एक सहसंबंधित क्वेरी संभवतः एक विकल्प से बेहतर प्रदर्शन कैसे कर सकती है।
मैंने देखा है कि कनिष्ठ डेवलपर्स ने कई बार उपश्रेणियों को सहसंबद्ध किया है और इसका आमतौर पर प्रदर्शन पर गंभीर प्रभाव पड़ा है। हालाँकि, जब एक सहसंबद्ध उपकुंजी को हटाते हैं तो यह सुनिश्चित करने से पहले और बाद में स्पष्ट करें कि आप प्रदर्शन को बदतर नहीं बना रहे हैं।
"वास्तविक" डेटाबेस के बजाय एक्सेस का उपयोग करना। SQL Express , MySQL और SQLite जैसे बहुत सारे छोटे छोटे और यहां तक कि मुफ्त डेटाबेस हैं जो काम करेंगे और बेहतर तरीके से स्केल करेंगे। ऐप्स को अक्सर अप्रत्याशित तरीकों से स्केल करने की आवश्यकता होती है।
भंडारण (भारी मात्रा में) डेटा के लिए एक्सेल का उपयोग करना।
मैंने कंपनियों को हजारों पंक्तियों को पकड़कर और कई कार्यपत्रकों का उपयोग करते हुए (एक्सेल के पिछले संस्करणों पर 65535 की पंक्ति सीमा के कारण) देखा है।
एक्सेल रिपोर्ट, डेटा प्रस्तुति और अन्य कार्यों के लिए अच्छी तरह से अनुकूल है, लेकिन इसे डेटाबेस के रूप में नहीं माना जाना चाहिए।
मैं जोड़ना चाहूंगा: अत्यधिक प्रदर्शन करने वाले कोड पर "सुरुचिपूर्ण" कोड के अनुकूल। डेटाबेस के खिलाफ सबसे अच्छा काम करने वाला कोड अक्सर एप्लिकेशन डेवलपर की आंखों में बदसूरत होता है।
विश्वास है कि समय से पहले अनुकूलन के बारे में बकवास। डेटाबेस को मूल डिज़ाइन और किसी भी बाद के विकास में प्रदर्शन पर विचार करना चाहिए। प्रदर्शन मेरी राय में डेटाबेस डिजाइन का 50% (40% डेटा अखंडता और अंतिम 10% सुरक्षा है)। डेटाबेस जो प्रदर्शन करने के लिए नीचे से निर्मित नहीं होते हैं, वे वास्तविक उपयोगकर्ताओं और डेटाबेस के विरुद्ध वास्तविक ट्रैफ़िक डाल देने के बाद खराब प्रदर्शन करेंगे। समयपूर्व अनुकूलन का मतलब कोई अनुकूलन नहीं है! इसका मतलब यह नहीं है कि आपको कोड लिखना चाहिए जो लगभग हमेशा खराब प्रदर्शन करेगा क्योंकि आपको यह आसान लगता है (उदाहरण के लिए कर्सर जो उत्पादन डेटाबेस में कभी भी अनुमति नहीं दी जानी चाहिए, जब तक कि बाकी सभी विफल न हो)। इसका मतलब है कि जब तक आपको प्रदर्शन करने की ज़रूरत न हो, तब तक आपको उस प्रदर्शन को कम करने की ज़रूरत नहीं है। डेटाबेस पर बेहतर प्रदर्शन करने के बारे में बहुत कुछ जाना जाता है,
पैरामीटर किए गए प्रश्नों का उपयोग नहीं करना। वे SQL इंजेक्शन को रोकने में बहुत आसान हैं ।
यह एक अन्य उत्तर में उल्लिखित इनपुट डेटा को साफ नहीं करने का एक विशिष्ट उदाहरण है।
जब डेवलपर्स नेस्टेड स्टेटमेंट्स का उपयोग करते हैं या यहां तक कि किसी क्वेरी के "सेलेक्ट" हिस्से के अंदर एक चुनिंदा स्टेटमेंट के परिणाम का भी उपयोग करते हैं तो मुझे इससे नफरत है।
मुझे वास्तव में आश्चर्य है कि मैं इसे कहीं और नहीं देखता, शायद मैंने इसे अनदेखा कर दिया, हालांकि @adam में इसी तरह का मुद्दा है।
उदाहरण:
SELECT
(SELECT TOP 1 SomeValue FROM SomeTable WHERE SomeDate = c.Date ORDER BY SomeValue desc) As FirstVal
,(SELECT OtherValue FROM SomeOtherTable WHERE SomeOtherCriteria = c.Criteria) As SecondVal
FROM
MyTable c
इस परिदृश्य में, यदि MyTable 10000 पंक्तियों को लौटाता है, तो ऐसा होता है जैसे कि क्वेरी सिर्फ 20001 क्वेरी को चलाता है, क्योंकि उसे परिणाम की प्रत्येक पंक्ति के लिए प्रारंभिक क्वेरी प्लस क्वेरी को प्रत्येक तालिका के एक बार चलाना था।
डेवलपर्स एक विकास के माहौल में इस काम के साथ दूर हो सकते हैं जहां वे केवल डेटा की कुछ पंक्तियों को वापस कर रहे हैं और उप-तालिकाओं में आमतौर पर केवल थोड़ी मात्रा में डेटा होता है, लेकिन एक उत्पादन वातावरण में, इस तरह की क्वेरी तेजी से महंगी हो सकती है डेटा तालिकाओं में जोड़ा जाता है।
एक बेहतर (जरूरी नहीं कि सही) उदाहरण कुछ इस तरह हो:
SELECT
s.SomeValue As FirstVal
,o.OtherValue As SecondVal
FROM
MyTable c
LEFT JOIN (
SELECT SomeDate, MAX(SomeValue) as SomeValue
FROM SomeTable
GROUP BY SomeDate
) s ON c.Date = s.SomeDate
LEFT JOIN SomeOtherTable o ON c.Criteria = o.SomeOtherCriteria
यह डेटाबेस ऑप्टिमाइज़र को मुख्य तालिका से प्रत्येक रिकॉर्ड पर आवश्यकता के बजाय डेटा को एक साथ फेरबदल करने की अनुमति देता है, और मुझे आमतौर पर लगता है कि मुझे कोड को ठीक करना होगा जहां यह समस्या बनाई गई है, मैं आमतौर पर प्रश्नों की गति 100% बढ़ाता हूं या सीपीयू और मेमोरी उपयोग को कम करते हुए एक साथ अधिक।
SQL- आधारित डेटाबेस के लिए:
उत्पादन डेटाबेस के अंदर कुछ समस्या को ठीक करने से पहले बैकअप नहीं लेना।
संग्रहीत कार्यविधियों में संग्रहीत ऑब्जेक्ट्स (जैसे टेबल, विचार) पर DDL कमांड का उपयोग करना।
जहाँ भी अधिक कुशल / उपयोग करने के लिए उपयुक्त हो, संग्रहीत खरीद या उपयोग करने के डर से ORM प्रश्नों का उपयोग करने का डर।
एक डेटाबेस प्रोफाइलर के उपयोग को अनदेखा करना, जो आपको यह बता सकता है कि आपकी ORM क्वेरी को आखिरकार किस रूप में परिवर्तित किया जा रहा है और इसलिए ORM का उपयोग न करने पर तर्क या डीबगिंग के लिए भी इसे सत्यापित करें।
सामान्यीकरण का सही स्तर न करना । आप यह सुनिश्चित करना चाहते हैं कि डेटा डुप्लिकेट नहीं है, और आप डेटा को आवश्यकतानुसार अलग कर रहे हैं। आपको यह भी सुनिश्चित करने की आवश्यकता है कि आप सामान्यीकरण का बहुत दूर तक पालन नहीं कर रहे हैं क्योंकि इससे प्रदर्शन को नुकसान होगा।
डेटाबेस को सिर्फ स्टोरेज मैकेनिज्म (यानी ग्लोरीफाइड कलेक्शन लाइब्रेरी) के रूप में मानना और इसलिए उनके एप्लिकेशन को अधीनस्थ करना (अन्य एप्लिकेशन को अनदेखा करना जो डेटा साझा करते हैं)
1 - अनावश्यक रूप से एक फ़ंक्शन का उपयोग उस मूल्य पर जहां खंड में उस सूचकांक के परिणाम का उपयोग नहीं किया जा रहा है।
उदाहरण:
where to_char(someDate,'YYYYMMDD') between :fromDate and :toDate
के बजाय
where someDate >= to_date(:fromDate,'YYYYMMDD') and someDate < to_date(:toDate,'YYYYMMDD')+1
और कुछ हद तक: उन मूल्यों के लिए कार्यात्मक अनुक्रमित नहीं जोड़ना, जिनकी उन्हें आवश्यकता है ...
2 - डेटा की वैधता सुनिश्चित करने के लिए चेक बाधाओं को जोड़ना नहीं। बाधाओं का उपयोग क्वेरी ऑप्टिमाइज़र द्वारा किया जा सकता है, और वे वास्तव में यह सुनिश्चित करने में मदद करते हैं कि आप अपने आक्रमणकारियों पर भरोसा कर सकते हैं। उनके उपयोग न करने का कोई कारण नहीं है।
3 - शुद्ध आलस्य या समय के दबाव से तालिकाओं में अप्राकृतिक कॉलम जोड़ना। चीजें आमतौर पर इस तरह से डिज़ाइन नहीं की जाती हैं, लेकिन इसमें विकसित होती हैं। बिना किसी असफलता के अंतिम परिणाम, एक टन है जो भविष्य में विकसित डेटा अखंडता द्वारा काटे जाने पर गंदगी को साफ करने की कोशिश करता है।
इसके बारे में सोचो, डेटा के बिना एक तालिका को फिर से डिज़ाइन करना बहुत सस्ता है। कोई अखंडता के साथ लाखों रिकॉर्ड के साथ एक तालिका ... इतना सस्ता करने के लिए सस्ता नहीं है। इस प्रकार, कॉलम या टेबल बनाते समय सही डिजाइन करना, हुकुम में परिशोधन है।
4 - प्रति से डेटाबेस के बारे में इतना नहीं है, लेकिन वास्तव में कष्टप्रद है। SQL की कोड गुणवत्ता के बारे में परवाह नहीं है। तथ्य यह है कि आपके एसक्यूएल को पाठ में व्यक्त किया गया है, यह स्ट्रिंग हेरफेर एल्गोरिदम के ढेर में तर्क को छिपाने के लिए ठीक नहीं है। एसक्यूएल को टेक्स्ट में इस तरीके से लिखना पूरी तरह से संभव है जो वास्तव में आपके साथी प्रोग्रामर द्वारा पढ़ा जा सके।
यह पहले कहा गया है, लेकिन: अनुक्रमित, अनुक्रमित, अनुक्रमित । मैंने खराब प्रदर्शन करने वाले एंटरप्राइज़ वेब ऐप के बहुत सारे मामले देखे हैं, जो कि केवल थोड़ी सी प्रोफाइलिंग करके तय किए गए थे (यह देखने के लिए कि कौन सी टेबल बहुत हिट हो रही हैं), और फिर उन टेबलों पर एक इंडेक्स जोड़ दिया। यह SQL लेखन ज्ञान के रास्ते में ज्यादा की आवश्यकता नहीं है, और अदायगी बहुत बड़ी है।
प्लेग की तरह डेटा दोहराव से बचें। कुछ लोग इस बात की वकालत करते हैं कि थोड़ा दोहराव चोट नहीं पहुंचाएगा, और प्रदर्शन में सुधार करेगा। अरे, मैं यह नहीं कह रहा हूं कि आपको अपने स्कीमा को थर्ड नॉर्मल फॉर्म में टॉर्चर करना होगा, जब तक कि यह इतना अमूर्त न हो जाए कि डीबीए का पता भी न चले। बस यह समझें कि जब भी आप नाम, या ज़िपकोड, या शिपिंग कोड के एक सेट को डुप्लिकेट करते हैं, तो प्रतियां अंततः एक दूसरे के साथ एक समय में बाहर हो जाती हैं। यह होगा। और फिर आप साप्ताहिक रखरखाव स्क्रिप्ट चलाने के साथ अपने आप को लात मारेंगे।
और अंत में: एक स्पष्ट, सुसंगत, सहज नामकरण सम्मेलन का उपयोग करें। उसी तरह से कि एक अच्छी तरह से लिखा हुआ कोड पठनीय होना चाहिए, एक अच्छा एसक्यूएल स्कीमा या क्वेरी पठनीय होना चाहिए और व्यावहारिक रूप से आपको यह बताना चाहिए कि यह क्या कर रहा है, यहां तक कि टिप्पणियों के बिना भी। आप छह महीने में खुद को धन्यवाद देंगे, जब आपको तालिकाओं पर रखरखाव करना होगा। "SELECT account_number, billing_date FROM national_accounts"
"SELECT ACCNTNBR, BILLDAT FROM NTNLACCS" की तुलना में काम करना आसान है।
बीस साल में सबसे आम गलती मैंने देखी है: आगे की योजना नहीं। कई डेवलपर्स डेटाबेस बनाएंगे, और टेबल, और फिर लगातार तालिकाओं को संशोधित और विस्तारित करेंगे क्योंकि वे अनुप्रयोगों का निर्माण करते हैं। अंतिम परिणाम अक्सर गड़बड़ी और अक्षम और बाद में साफ या सरल बनाने में मुश्किल होता है।
क) स्ट्रिंग
बी में हार्डकॉन्डिंग क्वेरी मान ) डेटाबेस फॉर्म कोड को "ऑनबॉटनप्रेस" कार्रवाई में एक विंडोज फॉर्म एप्लीकेशन में डाल देना
मैंने दोनों को देखा है।
यह सोचकर कि वे डीबीए और डेटा मॉडलर / डिज़ाइनर हैं, जब उनके पास उन क्षेत्रों में किसी भी प्रकार का कोई औपचारिक घर नहीं है।
यह सोचकर कि उनके प्रोजेक्ट को डीबीए की आवश्यकता नहीं है क्योंकि वह सामान सभी आसान / तुच्छ है।
डेटाबेस में किए जाने वाले कार्य और ऐप में किए जाने वाले कार्य के बीच उचित रूप से विचार करने में विफलता।
बैकअप मान्य नहीं है, या बैकअप नहीं है।
अपने कोड में कच्ची SQL एम्बेड करना।
यहां स्कॉट वल्ज द्वारा ' क्लासिक डाटाबेस डेवलपमेंट मिस्टेक्स और उन्हें दूर करने के पांच तरीके ' नामक वीडियो का लिंक दिया गया है
डेटाबेस समरूपता मॉडल की समझ नहीं होना और यह विकास को कैसे प्रभावित करता है। इस तथ्य के बाद अनुक्रमित और प्रश्नों को जोड़ना आसान है। हालांकि हॉटस्पॉट्स, संसाधन विवाद और सही संचालन के लिए उचित विचार के बिना डिज़ाइन किए गए एप्लिकेशन (यह मानते हुए कि आपने अभी जो पढ़ा है वह अभी भी मान्य है!) बाद में सही करने के लिए डेटाबेस और एप्लिकेशन टियर के भीतर महत्वपूर्ण बदलावों की आवश्यकता हो सकती है।
समझ में नहीं आता है कि कैसे एक DBMS हुड के तहत काम करता है।
क्लच कैसे काम करता है, यह समझे बिना आप स्टिक को ठीक से नहीं चला सकते। और आप समझ नहीं सकते हैं कि डेटाबेस का उपयोग कैसे करें, यह समझे बिना कि आप वास्तव में अपनी हार्ड डिस्क पर एक फ़ाइल में लिख रहे हैं।
विशेष रूप से:
क्या आप जानते हैं कि क्लस्टर इंडेक्स क्या है? क्या आपने इसके बारे में सोचा जब आपने अपना स्कीमा डिज़ाइन किया था?
क्या आप जानते हैं कि इंडेक्स का सही इस्तेमाल कैसे करें? सूचकांक का पुन: उपयोग कैसे करें? क्या आप जानते हैं कि एक आवरण सूचकांक क्या है?
इतना बढ़िया, आपके पास अनुक्रमित है। आपके सूचकांक में 1 पंक्ति कितनी बड़ी है? जब आपके पास बहुत सारा डेटा होगा तो इंडेक्स कितना बड़ा होगा? कि स्मृति में आसानी से फिट होगा? यदि यह एक सूचकांक के रूप में बेकार नहीं होगा।
क्या आपने कभी MySQL में EXPLAIN का उपयोग किया है? महान। अब अपने आप से ईमानदार रहें: क्या आपने जो देखा, उसका आधा हिस्सा भी आपको समझ में आया? नहीं, आपने शायद नहीं किया। उसे फिक्स करें।
क्या आप क्वेरी कैश को समझते हैं? क्या आप जानते हैं कि एक क्वेरी अन-कैचबल क्या है?
क्या आप MyISAM का उपयोग कर रहे हैं? यदि आपको पूर्ण पाठ खोज की आवश्यकता है, तो MyISAM का उपयोग बकवास है। स्फिंक्स का प्रयोग करें। फिर इनो पर स्विच करें।