बस एक अनुमान:
जब आप क्वेरी को हाथ से चलाते हैं, तो व्यंजक WHERE ('test' IS NULL or COL1 = 'test')
क्वेरी को पार्स किए जाने पर अनुकूलित किया जा सकता है। पार्सर देख सकता है कि स्ट्रिंग 'test'
शून्य नहीं है, इसलिए यह परीक्षण को WHERE COL1 = 'test'
. में बदल देता है . और अगर COL1
. पर कोई अनुक्रमणिका है इसका उपयोग किया जाएगा।
हालाँकि, जब आप कोई संग्रहीत कार्यविधि बनाते हैं, तो प्रक्रिया बनने पर पार्सिंग होती है। उस समय, यह नहीं जानता कि @param
. क्या है होगा, और क्वेरी को तालिका के अनुक्रमिक स्कैन के रूप में कार्यान्वित करना होगा।
अपनी कार्यविधि को इसमें बदलने का प्रयास करें:
IF @param IS NULL
THEN BEGIN
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...
END;
ELSE BEGIN
SELECT * FROM table1 WHERE col1 = @param
UNION ALL
SELECT * FROM table2 WHERE col1 = @param
...
END;
END IF;
मुझे MySQL संग्रहीत कार्यविधियों का अधिक अनुभव नहीं है, इसलिए मुझे यकीन नहीं है कि यह बिल्कुल सही सिंटैक्स है।