दो एसक्यूएल बयानों की गणितीय समानता


9

क्या दो एसक्यूएल बयानों की गणितीय समानता की जांच करने का एक तरीका है?

मेरे दो SQL कथन हैं:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

डेटा पर दोनों बयान चलाना और आउटपुट की तुलना करना बिल्कुल भी मदद नहीं करता है।

स्टेटमेंट के पीछे सेट मैथ्स का मूल्यांकन किया जाना चाहिए, जैसे कि एक समीकरण सॉल्वर करता है।

मेरे प्रश्न के दायरे से बाहर की चीजें हैं:

  • अन्य तब की तुलना (समानता, से कम, LIKE, ...)
  • संग्रहीत कार्यविधियाँ, या ट्रिगर
  • सामान्य टेबल एक्सप्रेशन (बिना)

दायरे में:

  • Subselects: अन्य में कहां (अन्य आईडी से चयन करें ...)
  • कार्यभार संभाला

एक आंशिक समाधान 2 प्रश्नों के निष्पादन योजनाओं की तुलना करेगा। यदि निष्पादन योजनाएं समान हैं, तो वे समान हैं। हालाँकि रिश्ता दोनों तरह से काम नहीं करता है। 2 तार्किक समतुल्य प्रश्न हो सकते हैं जिनमें विभिन्न निष्पादन योजनाएं हैं।
बुआहाएक्सडी

1
@BhahahaXD: यह सच नहीं है। select * from foo where id = 4निश्चित रूप से एक ही निष्पादन योजना होगीselect * from foo where id = 2
जैसे a_horse_with_no_name

@a_horse_with_no_name मैंने इसे SQL सर्वर पर परीक्षण किया और 2 अलग XML फाइलें मिलीं। पैरामीटर को XML फ़ाइल में <ParameterList> नोड के रूप में शामिल किया गया था। नेत्रहीन, ये योजनाएं समान थीं (तालिका स्कैन + चयन)। लेकिन मेरा मानना ​​है कि आप निष्पादन योजनाओं की तुलना करने के बारे में सही हो सकते हैं।
BuahahaXD

1
अद्वितीय कुंजियों की बात आने पर @a_horse_with_no_name सही है। सभी दूसरों के लिए, यह संभव है select * from foo where id = 4और select * from foo where id = 2अगर 1) अनुक्रमण आँकड़े अप-टू-डेट और 2 नहीं हैं दो अलग अलग निष्पादन की योजना है करने के लिए) भले ही अनुक्रमण आँकड़े अप-टू-डेट कर रहे हैं, आईडी के प्रमुख वितरण एकतरफा है (बशर्ते आईडी एक अद्वितीय कुंजी नहीं है)।
रोलैंडमाइसीडीडीबीए

जवाबों:


6

दो एसक्यूएल बयानों की गणितीय समानता क्या है? मेरे लिए दो प्रश्न समतुल्य हैं, जब दोनों को किसी भी डेटासेट के समान दिया जाता है, तो वे समान परिणाम सेट लौटाते हैं।

जैसा कि आपने बताया, संबंधपरक बीजगणित का सुपरसेट SQL क्वेरी, बहुत जटिल हो सकता है। हम सबक्वेरीज़ को मिक्स कर सकते हैं, संग्रहीत प्रक्रियाओं और फ़ंक्शंस ( नियतात्मक या नहीं) का उपयोग कर सकते हैं जो आपको क्वेरी को वास्तविक कोड की तरह दिखता है । अगर आप इस प्रकार के प्रश्नों के बारे में बात कर रहे हैं तो यह वास्तव में कठिन होने वाला है। वास्तव में यह "दो एल्गोरिदम समतुल्य" समस्या से अलग नहीं है।

उन परिस्थितियों में यह शायद असंभव है।

तथापि...

... यह संभव हो सकता है यदि आप जिन दो प्रश्नों की तुलना करना चाहते हैं, वे सख्त सेट संचालन हैं। यदि ऐसा है, तो आप प्रश्नों को संबंधपरक बीजगणित में बदल सकते हैं और फिर समतुल्यता नियमों का पालन ​​करके इसे काम कर सकते हैं । यदि आपके पास nontrivial boolean स्थितियों के साथ चयन / प्रतिबंध है, तो आपको यह साबित करने की आवश्यकता समाप्त हो सकती है कि थोस की स्थिति भी समतुल्य है। फिर आपको बूलियन बीजगणित पर भरोसा करने की आवश्यकता होगी और आप शायद एक सत्य तालिका कर लेंगे ।

जैसा कि आप देख सकते हैं कि यह बहुत काम आने वाला है और जहाँ तक मुझे पता है, कुछ भी मौजूद नहीं है। फिर भी, मुझे कुछ उपकरण मिले जो आपको उपयोगी लग सकते हैं यदि आप कार्य से निपटना चाहते हैं:


मेरा सवाल केवल सेट ऑपरेशन के बारे में है। मैंने सवाल अपडेट किया। यह "दो एल्गोरिदम समतुल्य" समस्या से संबंधित है। लेकिन संदर्भ सीमा है, केवल सेट, जॉइन, सबसेक्ट्स के बुनियादी संचालन मेरे दायरे में हैं।
गुफ्तगू

3

परिभाषा द्वारा परिमित समय में अर्थ समतुल्यता की जाँच करना असंभव है, देखें राइस का प्रमेय :

आंशिक कार्यों की किसी भी गैर-तुच्छ संपत्ति के लिए, यह तय करने के लिए कोई सामान्य और प्रभावी तरीका नहीं है कि क्या एल्गोरिथ्म उस संपत्ति के साथ आंशिक फ़ंक्शन की गणना करता है।


2
यह केवल एक टिप्पणी नहीं है। क्या आप इस संदर्भ में चावल की प्रयोज्यता पर विस्तार कर सकते हैं, कृपया।
माइकल ग्रीन

भले ही यह सैद्धांतिक रूप से संभव था कि वर्तमान एसक्यूएल मानक वाक्यविन्यास कितना बारोक है, यह व्यवहार में असंभव होगा
जेम्स एंडरसन

1
ओपी स्पष्टीकरण के साथ ऐसा लग रहा है कि प्रश्न शब्दार्थक तुल्यता की तुलना में तार्किक समानता के बारे में अधिक है। असली सवाल यह है: क्या हम एसक्यूएल बयानों को गणितीय अभिव्यक्ति में बदल सकते हैं और फिर तार्किक तुल्यता का मूल्यांकन कर सकते हैं?
फॉरग्रेस

2

dba उपयोगकर्ता Lennart ने मुझे इस परियोजना की ओर इशारा किया:

http://cosette.cs.washington.edu/

Cosette SQL प्रश्नों के समकक्षों की जाँच के लिए एक स्वचालित कहावत है। यह Coq प्रूफ सहायक और रोसेट प्रतीकात्मक आभासी मशीन में SQL के एक बड़े टुकड़े को औपचारिक रूप देता है। यह दिए गए प्रश्नों की एक जोड़ी के लिए समकक्षता का एक औपचारिक प्रमाण या एक प्रतिपक्षता देता है।


1

इसे करने का एक तरीका पार्सर, या बेहतर निर्माण करना है, एक मौजूदा का उपयोग करना है। मेरा मानना ​​है कि C # में TSQLParser क्लास है और इसमें Parse () विधि है। पार्सर आपकी क्वेरी को उप-कक्षाओं में तोड़ देगा, जिनकी आप तब तुलना कर सकते हैं।


1

यदि आप एक सेट थ्योरी आधारित समकक्ष परीक्षण की तलाश कर रहे हैं, तो आपकी सबसे अच्छी शर्त किसी भी WHEREस्थिति को परिवर्तित करना है जिसे एक प्रकार के JOIN(आंतरिक या बाहरी) में परिवर्तित किया जा सकता है और उसका विवरण फिर से दिया गया है। इसमें शामिल है IN subselectऔर खंड EXISTS subselectमें कोई भी अन्य शर्त WHEREजिसमें शब्द शामिल है SELECT। यदि आप दोनों एसक्यूएल बयानों पर यह प्रदर्शन करते हैं, तो आपके पास एक नया FROMखंड होगा जो सेट-आधारित तर्क / गणित का प्रतिनिधित्व करता है जिसमें आप रुचि रखते हैं। फिर आप केवल दो बयानों की तुलना कर सकते हैं। यदि आप यह सब करने के स्वचालित तरीके की तलाश कर रहे हैं, तो मुझे एक ऐसे उपकरण के बारे में नहीं पता है जो वास्तव में ऐसा कर सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.