मान कोडिंग हार्ड कोडिंग करता है मेरे पास एक संग्रहित प्रक्रिया है जो बहुत कुछ करती है। जब मैं एक चर घोषित करता हूं, तो अपना मान निर्धारित करता हूं और फिर उस खंड में इसका उपयोग करता हूं जहां बयान में एक घंटे से अधिक समय लगता है। जब मैं हार्ड कोड को चर कोड करता हूं जहां यह खंड एक सेकंड से भी कम समय में चलता है।पैरामीटर प्रदर्शन नहीं करता है साथ ही
मैंने निष्पादन योजनाओं के माध्यम से इसके साथ क्या गलत था, यह देखना शुरू कर दिया। ऐसा लगता है कि जब मैं कोशिश करता हूं और कुछ घोषित चर को पास करता हूं तो निष्पादन योजना कुछ हैश मैच को क्रेट करती है क्योंकि यह उस दृश्य से मानों का चयन करती है जो यूनियन और एक सामान्य तालिका अभिव्यक्ति का उपयोग करती है।
/************* Begin of Stored Procedure ***************/ CREATE PROCEDURE GetFruit @ColorId bigint, @SeasionId bigint WITH RECOMPILE AS BEGIN SELECT A.Name FROM [Apple_View] A /* This is the view down below */ INNER JOIN [Fruit] F ON (F.ColorId = @ColorId AND A.FruitId = F.FruitId) WHERE (A.ColorId = @ColorId AND A.SeasonId = @SeasonId) END /************* End of Stored Procedure ***************/ /************* Begin of View ***************/ WITH Fruits (FruitId, ColorId, SeasonId) AS ( -- Anchor member SELECT F.FruitId ,F.ColorId ,F.SeasonId FROM (( SELECT DISTINCT EF.FruitId ,EF.ColorId ,EF.SeasonId ,EF.ParentFruitId FROM ExoticFruit EF INNER JOIN Fruit FR ON FR.FruitId = EF.FruitId UNION SELECT DISTINCT SF.FruitId ,SF.ColorId ,SF.SeasonId ,SF.ParentFruitId FROM StinkyFruit SF INNER JOIN Fruit FR ON FR.FruitId = SF.FruitId UNION SELECT DISTINCT CF.FruitId ,CF.ColorId ,CF.SeasonId ,CF.ParentFruitId FROM CrazyFruit CF INNER JOIN Fruit FR ON FR.FruitId = CF.FruitId )) f UNION ALL -- Recursive Parent Fruit SELECT FS.FruitId ,FS.ColorId ,FS.SeasonId ,FS.ParentFruitId FROM Fruits FS INNER JOIN MasterFruit MF ON MF.[ParentFruitId] = fs.[FruitId] ) SELECT DISTINCT FS.FruitId ,FS.ColorId ,FS.SeasonId FROM Fruits FS /************* End of View ***************/ /* To Execute */ EXEC GetFruit 1,3
अगर मैं सेट मूल्यों यह एक घंटे से अधिक समय लगता है और यहाँ का उपयोग कर संग्रहित प्रक्रिया चलाने के लिये कार्य योजना लागू है।
WHERE(A.ColorId = 1 AND A.SeasonId = 3)
:
अगर मैं संग्रहित प्रक्रिया घोषित करने और सेट मूल्यों को दूर करने और सिर्फ निम्न कथन यह एक दूसरे से कम में चलता है और यहाँ कहाँ खंड सेट चलाने के लिये कार्य योजना लागू है
ध्यान दें कि हार्ड कोडित वेरिएबल्स इंडेक्सिंग का उपयोग कैसे करते हैं जबकि पहले हैश सेट का उपयोग करता है। ऐसा क्यों है? जहां घोषित चर से अलग काम कर रहे हैं, वहां कठोर कोडित मूल्य क्यों हैं?
------- यह है कि क्या अंत में
मैं संग्रहीत प्रक्रिया बदल sp_executesql उपयोग करने के लिए @ user1166147 ------ की मदद से किया जाता है।
CREATE PROCEDURE GetFruit @ColorId bigint, @SeasionId bigint WITH RECOMPILE AS BEGIN DECLARE @SelectString nvarchar(max) SET @SelectString = N'SELECT A.Name FROM [Apple_View] A /* This is the view down below */ INNER JOIN [Fruit] F ON (F.ColorId = @ColorId AND A.FruitId = F.FruitId) WHERE (A.ColorId = ' + CONVERT(NVARCHAR(MAX), @ColorId) + ' AND A.SeasonId = ' + CONVERT(NVARCHAR(MAX), @SeasonId) + ')' EXEC sp_executesql @SelectString END
आप सुनिश्चित करें कि आपके पैरामीटर डेटा प्रकार स्तंभ डेटा प्रकार मिलान करने के लिए जांच की है? – HackedByChinese
ये चर नहीं हैं पैरामीटर। एसक्यूएल सर्वर परिवर्तनीय स्नीफिंग नहीं करता है इसलिए चयनशीलता अनुमान अनुमान लगाए जाएंगे। यदि आप 'विकल्प (रिकॉम्प्ली)' जोड़ते हैं तो क्या होगा? –
विकल्प विकल्प recompile। वहाँ कुछ पैरामीटर स्नीफिंग कहा जाता है जिसमें SQL सर्वर इनपुट मान – praveen