mysql

2011-10-30 5 views
27

में निर्धारित कार्य मैं एक साधारण सरल अवधारणा से उलझन में आया। Mysql एक समारोह है किmysql

हमेशा एक ही परिणाम पैदा करता है एक ही इनपुट के लिए मेरी समझ में मानकों

तो, जैसे

CREATE FUNCTION foo (val INT) READS SQL DATA 
BEGIN 
    DECLARE retval INT; 
    SET retval = (SELECT COUNT(*) FROM table_1 WHERE field_1 = val); 
    RETURN retval; 
END; 

निर्धारित करने योग्य नहीं हैं कार्यों के रूप में नियतात्मक समारोह को परिभाषित करता है (वहाँ है कोई गारंटी नहीं है कि फ़ंक्शन में 2 कॉल के बीच हटाएं/अपडेट/डालें नहीं होता है)। साथ ही, मैंने कई कार्यों को देखा जो बहुत अधिक करते हैं, यानी प्रश्नों के परिणाम के आधार पर वापसी मूल्य, और DETERMINISTIC के रूप में घोषित किया गया। ऐसा लगता है कि मैं कुछ बहुत बुनियादी याद कर रहा हूँ।

कोई भी इस मुद्दे को स्पष्ट कर सकता है?

धन्यवाद।

अद्यतन उन लोगों के लिए धन्यवाद जिन्होंने उत्तर दिया (+1); अब तक ऐसा लगता है कि DETERMINISTIC कीवर्ड का व्यापक दुरुपयोग है। मेरे लिए विश्वास करना अभी भी मुश्किल है कि बहुत से लोग ऐसा करते हैं, इसलिए मैं अन्य उत्तरों के लिए थोड़ा इंतजार करूंगा।

+0

क्या आप "कई फ़ंक्शंस" का उदाहरण बता सकते हैं जिसके बारे में आप बात कर रहे हैं? – Mat

+0

@Mat: उदाहरण के लिए, http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html (उपयोगकर्ता टिप्पणियां अनुभाग में, "फ़ंक्शन डीबी.फनफुलनाम नाम" के लिए खोजें - यह पंक्ति से पढ़ता है एक पास आईडी के लिए डीबी और चयन के परिणाम के आधार पर मूल्य वापसी)। – a1ex07

+0

"... उपयोगकर्ता टिप्पणियां ..." ... कुछ असली mysql फ़ंक्शन आपके मन में है? – Mat

उत्तर

14

MySQL 5.0 संदर्भ से:

एक नियमित की प्रकृति का आकलन निर्माता की "ईमानदारी" पर आधारित है: MySQL जाँच नहीं करता है एक नियमित घोषणा की कि नियतात्मक बयान है कि गैर नियतात्मक उत्पादन से मुक्त है परिणाम है। हालांकि, एक दिनचर्या गलत तरीके से परिणाम प्रभावित कर सकते हैं या प्रदर्शन को प्रभावित कर सकते हैं। डेट्रोमिनिस्टिक के रूप में एक नोडेटर्मेनिस्टिक रूटीन घोषित करने से ऑप्टिमाइज़र को गलत निष्पादन योजना विकल्प बनाने के कारण अप्रत्याशित परिणाम हो सकते हैं। एक निर्धारक दिनचर्या घोषित करने के रूप में NONDETERMINISTIC उपयोग किए जाने वाले उपलब्ध अनुकूलन के कारण प्रदर्शन को कम कर सकता है। MySQL 5.0.44 से पहले, डिटेरमिनिस्ट विशेषता को स्वीकार किया जाता है, लेकिन ऑप्टिमाइज़र द्वारा उपयोग नहीं किया जाता है।

तो वहाँ तुम्हारे पास है

, आप DETERMINISTIC के रूप में एक संग्रहीत दिनचर्या टैग कर सकते हैं, भले ही यह नहीं है, लेकिन यह अप्रत्याशित परिणाम या प्रदर्शन समस्याओं को जन्म दे सकता है।

+3

तो क्या हमें हमेशा गलत चुनने का 50% मौका मिल सकता है? महान। lol आपकी टिप्पणी ने मुझे थोड़ा और समझने में मदद की। – Cesar

+0

"नेस्टेड सेट मॉडल" उदाहरण में। http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ मैं नोड्स डालने और हटाने के लिए दिनचर्या का उपयोग कर रहा हूं। 1) क्या हम मान सकते हैं कि सभी नोड सीमाओं (वास्तविक सीमाओं में 2 जोड़ना) दाएं (बाद में) सम्मिलन बिंदु (संदर्भ के रूप में चयनित नोड) को अद्यतन करने के लिए डिटेरमिनिस्टिक है? 2) इसलिए एक नोड को भी नष्ट कर रहे हैं? 3) एक नोड को इसकी वास्तविक स्थिति के बाईं ओर ले जाना? 4) नोड को इसकी वास्तविक स्थिति का अधिकार ले जाना? – llange

+0

यह सुविधा क्यों है? शायद एक तेजी से संकलन अगर एक समारोह वास्तव में '3 + एक्स = आउटपुट' की तरह निर्धारिती है? –

2

आप कुछ भी याद नहीं कर रहे हैं। यह कार्य गैर-निर्धारिती है। इसे निर्धारिती घोषित करने से आपके डेटाबेस को पिघलने का कारण नहीं होगा लेकिन यह प्रदर्शन को प्रभावित कर सकता है। From the MySQL site: "डेट्रोमिनिस्टिक के रूप में एक नोडेटर्मेनिस्टिक रूटीन घोषित करने से ऑप्टिमाइज़र को गलत निष्पादन योजना विकल्प बनाने के कारण अप्रत्याशित परिणाम हो सकते हैं।" लेकिन MySQL लागू नहीं करता है या जांचता है कि क्या आपका घोषित निर्धारिती दिनचर्या वास्तव में निर्धारक है --- MySQL ट्रस्ट जो आप जानते हैं कि आप क्या कर रहे हैं।

+1

यह दिनचर्या निश्चित है क्योंकि यदि आप दो समान डेटाबेस पर इस दिनचर्या को निष्पादित करते हैं तो परिणाम हमेशा समान होंगे। – bikeman868

8

डेटरमिनिस्टिक परिणाम विभिन्न परिणामों पर अलग-अलग परिणामों को संदर्भित नहीं करते हैं (इस समय के आधार पर कौन सा डेटा जोड़ा गया है)। इसके अलावा यह एक ही डेटा का उपयोग कर विभिन्न मशीनों पर परिणाम सेट का संदर्भ है। उदाहरण के लिए, आपके पास 2 मशीनें हैं जो यूयूआईडी() या सर्वर चर के संदर्भ में एक फ़ंक्शन चलाती हैं, तो इन्हें डिटर्मिनेस्टिक नहीं माना जाना चाहिए। उदाहरण के लिए यह प्रतिकृति में उपयोगी है क्योंकि फ़ंक्शन कॉल बाइनरी लॉग (मास्टर) में संग्रहीत हैं और फिर दास द्वारा निष्पादित भी हैं। विवरण और उदाहरणों के लिए http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html

इस प्रकार का समय (99% समय) सही है, दुरुपयोग नहीं माना जाता है।

+0

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

+0

"एक ही परिणाम उत्पन्न करता है" का अर्थ डेटाबेस में एक ही परिणाम उत्पन्न करता है। इसका मतलब यह नहीं है कि एक ही परिणाम सेट लौटाता है। परिणाम सेट सेट हर बार अलग होने पर MySQL देखभाल क्यों करेगा? यह परवाह करता है हालांकि परिणामस्वरूप संग्रहीत डेटा अलग है - अधिक जानकारी के लिए मेरा उत्तर देखें। – bikeman868

+0

मैं जॉन गिल्बर्ट और बिकमैन 868 के उत्तरों की सराहना करता हूं ... मेरी इच्छा है कि कुछ आधिकारिक स्रोत उन्हें वापस लाएंगे। [यह dba.stackexchange.com उत्तर] (https://dba.stackexchange.com/questions/4079/mysql-deterministic-procedures/4080#4080) 23k प्रतिनिधि वाले किसी व्यक्ति द्वारा विपरीत उत्तर देता है। –

0

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

3

मुझे लगता है कि आपका दिनचर्या निर्धारित है। दस्तावेज़ीकरण बहुत स्पष्ट नहीं है और इसने कई लोगों को इस मुद्दे के बारे में बहुत उलझन में डाल दिया है, जो वास्तव में किसी और चीज की तुलना में प्रतिकृति के बारे में अधिक है।

ऐसी स्थिति पर विचार करें जहां आपने दो डेटाबेस के बीच प्रतिकृति स्थापित की है। मास्टर डेटाबेस उन सभी संग्रहीत दिनचर्या का लॉग रखता है जिन्हें उनके इनपुट पैरामीटर सहित निष्पादित किया गया था, और यह लॉग दास को भेजता है। गुलाम उसी इनपुट पैरामीटर को उसी इनपुट पैरामीटर के साथ उसी क्रम में निष्पादित करता है। क्या गुलाम डेटाबेस में अब मास्टर डेटाबेस के समान डेटा होगा? यदि संग्रहीत दिनचर्या GUID बनाते हैं और इन्हें डेटाबेस में संग्रहीत करते हैं तो नहीं, मास्टर और गुलाम डेटाबेस अलग होंगे और प्रतिकृति टूट जाएगी।

डेटरमिनिस्टिक ध्वज का मुख्य उद्देश्य MySQL को बताना है कि प्रतिकृति लॉग में इस संग्रहीत दिनचर्या में कॉल सहित मास्टर डेटाबेस और प्रतिकृति दासों के बीच मतभेद होंगे, और इसलिए असुरक्षित है।

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

यदि आप घोषित करते हैं कि आपका दिनचर्या निर्धारित नहीं है, तो आपके मुख्य डेटाबेस की प्रतिकृति मूल के समान नहीं हो सकती है क्योंकि MySQL केवल प्रतिकृति लॉग में प्रक्रिया कॉल जोड़ देगा, और दास पर प्रक्रिया निष्पादित करेगा समान परिणाम नहीं उत्पन्न करते हैं।

यदि आपका दिनचर्या गैर-निर्धारक है तो MySQL में प्रतिकृति लॉग में प्रभावित पंक्तियों को शामिल करना होगा। यदि आप अपनी रूटीन को गैर-निर्धारिती के रूप में घोषित करते हैं तो यह कुछ भी नहीं तोड़ देगा, लेकिन प्रतिकृति लॉग में सभी प्रभावित पंक्तियां होंगी जब केवल प्रक्रिया कॉल पर्याप्त होगा और इससे प्रदर्शन प्रभावित हो सकता है।

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