दिलचस्प पोस्ट
टीएफएस में फाइल / निर्देशिकाओं को कैसे नजरअंदाज कर उन्हें केंद्रीय स्रोत भंडार में जाने से बचने के लिए? SQL सर्वर में एक चयन से मैं कैसे अपडेट करूं? सफारी में UIWebViewView लिंक खोलें सीएसएस ट्रांसफ़ॉर्म, क्रोम में दांतेदार किनारों जब आप वास्तव में जावा में अस्थिर खोजशब्द का उपयोग करते हैं? आप सी में एक फ़ाइल के आकार का निर्धारण कैसे करते हैं? InotifyPropertyChanged को लागू किए बिना बाध्यकारी अद्यतन क्यों करता है? "बुराई" किए बिना DoEvents () का उपयोग कैसे करें? सी ++ कंपाइलर्स ऑपरेटर == और ऑपरेटर को परिभाषित क्यों नहीं करते! =? एंड्रॉइड में बैटरी स्तर और राज्य प्राप्त करें पायथन में मेटाक्लास क्या है? डुप्लिकेट की गई पंक्तियों का सूचियां ढूंढें Regex के साथ सभी गैर-शब्द वर्णों को निकालना (सी # रेग्युलर एक्सप्रेशन पैटर्न में regex delimiters) PHP यूएमएल जेनरेटर MySQL मैच () के विरुद्ध () – प्रासंगिकता और स्तंभ द्वारा आदेश?

SQL सर्वर: क्वेरी तीव्र है, लेकिन प्रक्रिया से धीमी है

एक प्रश्न तेजी से चलाता है:

DECLARE @SessionGUID uniqueidentifier SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908' SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 

उपखंड की लागत: 0.502

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

 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank EXECUTE ViewOpener @SessionGUID 

उपप्रति लागत: 1 9 .2

मैंने भाग लिया है

 sp_recompile ViewOpener 

और यह अभी भी एक ही (बुरी तरह से) चलाता है, और मैंने भी संग्रहीत कार्यविधि को बदल दिया है

 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS SELECT *, 'recompile please' FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 

और फिर से, वास्तव में इसे फिर से कंपाइलिंग करने की कोशिश कर रहे हैं।

मैंने इसे नई योजना बनाने के लिए संग्रहीत कार्यविधि को छोड़ दिया और पुन: निर्माण किया है

मैंने रीकंपाइलों को मजबूर करने की कोशिश की है, और एक प्रलोभन चर का उपयोग कर पैरामीटर सूँघने को रोकने के लिए :

 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS DECLARE @SessionGUIDbitch uniqueidentifier SET @SessionGUIDbitch = @SessionGUID SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUIDbitch ORDER BY CurrencyTypeOrder, Rank 

मैंने WITH RECOMPILE संग्रहीत कार्यप्रणाली को परिभाषित करने की भी कोशिश की है:

 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier WITH RECOMPILE AS SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 

इसलिए कि यह योजना कभी भी कैश नहीं की जाती है, और मैंने निष्पादित होने पर पुनः कंपाइल करने की कोशिश की है:

 EXECUTE ViewOpener @SessionGUID WITH RECOMPILE 

किसने मदद नहीं की

मैंने गतिशील SQL के लिए प्रक्रिया को बदलने की कोशिश की है:

 CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier WITH RECOMPILE AS DECLARE @SQLString NVARCHAR(500) SET @SQLString = N'SELECT * FROM Report_OpenerTest WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank' EXECUTE sp_executesql @SQLString, N'@SessionGUID uniqueidentifier', @SessionGUID 

किसने मदद नहीं की

इकाई " Report_Opener " एक दृश्य है, जो अनुक्रमित नहीं है। दृश्य केवल अंतर्निहित तालिकाओं का संदर्भ देता है। कोई तालिका में गणना की गई कॉलम, अनुक्रमित या अन्यथा नहीं है।

इसके नरक के लिए मैंने इसके साथ दृश्य बनाने का प्रयास किया

 SET ANSI_NULLS ON SET QUOTED_IDENTIFER ON 

उसने इसे ठीक नहीं किया

यह कैसी है?

  • क्वेरी तेज है
  • क्वेरी को एक दृश्य में ले जा रहा है, और दृश्य से चयन तेज है
  • संग्रहीत कार्यविधि से देखने से चुनना 40x धीमी है?

मैंने दृश्य की परिभाषा को सीधे संग्रहीत कार्यविधि (3 व्यावसायिक नियमों का उल्लंघन करने और एक महत्वपूर्ण इनकैप्सुलेशन) में शामिल करने की कोशिश की, और इससे केवल 6x धीमी गति होती है

क्यों संग्रहीत प्रक्रिया संस्करण इतनी धीमी है? संभवतः एसक्यूएल सर्वर के लिए एड-हॉक एसक्यूएल से अलग तरह के एड-हॉक एसक्यूएल चलने के लिए संभवतः खाता हो सकता है?

मैं वास्तव में नहीं बल्कि नहीं होगा

  • कोड में एसक्यूएल एम्बेड करें
  • कोड को बिल्कुल बदल दें

     Microsoft SQL Server 2000 - 8.00.2050 (Intel X86) Mar 7 2008 21:29:56 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

लेकिन एसक्यूएल सर्वर के रूप में तेजी से चलने में असमर्थ होने के लिए क्या खाता हो सकता है क्योंकि एसक्यूएल सेवर एक क्वेरी चल रहा है, यदि नहीं पैंटिंग सूँघने।


मेरी अगली कोशिश को StoredProcedureA किया जाएगा, StoredProcedureA कॉल को StoredProcedureA कॉल को StoredProcedureA StoredProcedureB कॉल StoredProcedureC StoredProcedureD को देखने के लिए क्वेरी करें।

और असफल होने पर, संग्रहीत कार्यविधि को एक संग्रहीत कार्यविधि कहते हैं, एक यूडीएफ को कॉल करें, यूडीएफ को कॉल करें, एक संग्रहीत प्रक्रिया को कॉल करें, यूडीएफ को देखने के लिए कॉल करें।


संक्षेप करने के लिए, क्यूए से तेज़ी से निम्नलिखित रन चलते हैं, लेकिन एक संग्रहीत कार्यविधि में डालते समय धीमी गति से:

असली:

 --Runs fine outside of a stored procedure SELECT * FROM Report_OpenerTest WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 

sp_executesql :

 --Runs fine outside of a stored procedure DECLARE @SQLString NVARCHAR(500) SET @SQLString = N'SELECT * FROM Report_OpenerTest WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank' EXECUTE sp_executesql @SQLString, N'@SessionGUID uniqueidentifier', @SessionGUID 

EXEC(@sql) :

 --Runs fine outside of a stored procedure DECLARE @sql NVARCHAR(500) SET @sql = N'SELECT * FROM Report_OpenerTest WHERE SessionGUID = '''+CAST(@SessionGUID AS varchar(50))+''' ORDER BY CurrencyTypeOrder, Rank' EXEC(@sql) 

निष्पादन योजनाएं

अच्छी योजना:

  |--Sort(ORDER BY:([Expr1020] ASC, [Currencies].[Rank] ASC)) |--Compute Scalar(DEFINE:([Expr1020]=If ([Currencies].[CurrencyType]='ctCanadianCash') then 1 else If ([Currencies].[CurrencyType]='ctMiscellaneous') then 2 else If ([Currencies].[CurrencyType]='ctTokens') then 3 else If ([Currencies].[CurrencyType] |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Openers].[OpenerGUID])) |--Filter(WHERE:((([Currencies].[IsActive]<>0 AND [Currencies].[OnOpener]<>0) AND ((((((([Currencies].[CurrencyType]='ctUSCoin' OR [Currencies].[CurrencyType]='ctMiscellaneousUS') OR [Currencies].[CurrencyType]='ctUSCash') OR [Currencies]. | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Currencies].[CurrencyGUID], [Openers].[OpenerGUID]) WITH PREFETCH) | |--Nested Loops(Left Outer Join) | | |--Bookmark Lookup(BOOKMARK:([Bmk1016]), OBJECT:([GrobManagementSystemLive].[dbo].[Windows])) | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([Openers].[WindowGUID])) | | | |--Bookmark Lookup(BOOKMARK:([Bmk1014]), OBJECT:([GrobManagementSystemLive].[dbo].[Openers])) | | | | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_SessionGUID]), SEEK:([Openers].[SessionGUID]=[@SessionGUID]) ORDERED FORWARD) | | | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Windows].[IX_Windows]), SEEK:([Windows].[WindowGUID]=[Openers].[WindowGUID]) ORDERED FORWARD) | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType])) | |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID] AND [OpenerDetails].[CurrencyGUID]=[Currenc |--Hash Match(Cache, HASH:([Openers].[OpenerGUID]), RESIDUAL:([Openers].[OpenerGUID]=[Openers].[OpenerGUID])) |--Stream Aggregate(DEFINE:([Expr1006]=SUM(If (((([Currencies].[CurrencyType]='ctMiscellaneous' OR [Currencies].[CurrencyType]='ctTokens') OR [Currencies].[CurrencyType]='ctChips') OR [Currencies].[CurrencyType]='ctCanadianCoin') OR [ |--Nested Loops(Inner Join, OUTER REFERENCES:([OpenerDetails].[CurrencyGUID]) WITH PREFETCH) |--Nested Loops(Inner Join) | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_OneOpenerPerSession]), SEEK:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD) | |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD) |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[PK_Currencies_CurrencyGUID]), SEEK:([Currencies].[CurrencyGUID]=[OpenerDetails].[CurrencyGUID]) ORDERED FORWARD) 

बुरी योजना

  |--Sort(ORDER BY:([Expr1020] ASC, [Currencies].[Rank] ASC)) |--Compute Scalar(DEFINE:([Expr1020]=If ([Currencies].[CurrencyType]='ctCanadianCash') then 1 else If ([Currencies].[CurrencyType]='ctMiscellaneous') then 2 else If ([Currencies].[CurrencyType]='ctTokens') then 3 else If ([Currencies].[Currency |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Openers].[OpenerGUID])) |--Filter(WHERE:((([Currencies].[IsActive]<>0 AND [Currencies].[OnOpener]<>0) AND ((((((([Currencies].[CurrencyType]='ctUSCoin' OR [Currencies].[CurrencyType]='ctMiscellaneousUS') OR [Currencies].[CurrencyType]='ctUSCash') OR [Currenc | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Currencies].[CurrencyGUID], [Openers].[OpenerGUID]) WITH PREFETCH) | |--Filter(WHERE:([Openers].[SessionGUID]=[@SessionGUID])) | | |--Concatenation | | |--Nested Loops(Left Outer Join) | | | |--Table Spool | | | | |--Hash Match(Inner Join, HASH:([Windows].[WindowGUID])=([Openers].[WindowGUID]), RESIDUAL:([Windows].[WindowGUID]=[Openers].[WindowGUID])) | | | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Windows].[IX_Windows_CageGUID])) | | | | |--Table Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Openers])) | | | |--Table Spool | | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType])) | | |--Compute Scalar(DEFINE:([Openers].[OpenerGUID]=NULL, [Openers].[SessionGUID]=NULL, [Windows].[UseChipDenominations]=NULL)) | | |--Nested Loops(Left Anti Semi Join) | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType])) | | |--Row Count Spool | | |--Table Spool | |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID] AND [OpenerDetails].[CurrencyGUID]=[Cu |--Hash Match(Cache, HASH:([Openers].[OpenerGUID]), RESIDUAL:([Openers].[OpenerGUID]=[Openers].[OpenerGUID])) |--Stream Aggregate(DEFINE:([Expr1006]=SUM([partialagg1034]), [Expr1007]=SUM([partialagg1035]), [Expr1008]=SUM([partialagg1036]), [Expr1009]=SUM([partialagg1037]), [Expr1010]=SUM([partialagg1038]), [Expr1011]=SUM([partialagg1039] |--Nested Loops(Inner Join) |--Stream Aggregate(DEFINE:([partialagg1034]=SUM(If (((([Currencies].[CurrencyType]='ctMiscellaneous' OR [Currencies].[CurrencyType]='ctTokens') OR [Currencies].[CurrencyType]='ctChips') OR [Currencies].[CurrencyType]=' | |--Nested Loops(Inner Join, OUTER REFERENCES:([OpenerDetails].[CurrencyGUID]) WITH PREFETCH) | |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD) | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[PK_Currencies_CurrencyGUID]), SEEK:([Currencies].[CurrencyGUID]=[OpenerDetails].[CurrencyGUID]) ORDERED FORWARD) |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_OneOpenerPerSession]), SEEK:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD) 

बुरा-एक 6 मिलियन पंक्तियों के लिए उत्सुक है; दूसरा नहीं है

नोट: यह कोई क्वेरी ट्यूनिंग के बारे में कोई प्रश्न नहीं है। मेरे पास एक ऐसी क्वेरी है जो बिजली तेज चलती है मैं सिर्फ एक संग्रहीत प्रक्रिया से तेजी से चलाने के लिए SQL सर्वर चाहता हूँ।

वेब के समाधान से एकत्रित समाधान "SQL सर्वर: क्वेरी तीव्र है, लेकिन प्रक्रिया से धीमी है"

मुझे मूल पोस्टर के समान समस्या थी, लेकिन उद्धृत उत्तर ने मेरे लिए समस्या का समाधान नहीं किया। क्वेरी अभी भी एक संग्रहीत कार्यविधि से वास्तव में धीमी गति से चला गया।

मुझे एक और जवाब मिला "पैरामीटर सूँघने" , धन्यवाद ओमनीबज़। आपकी संग्रहीत कार्यविधि प्रश्नों में "स्थानीय चर" का उपयोग करने के लिए उबाल हो जाता है, लेकिन अधिक समझने के लिए मूल पढ़ें, यह एक महान लिखना है जैसे

धीमा तरीका:

 CREATE PROCEDURE GetOrderForCustomers(@CustID varchar(20)) AS BEGIN SELECT * FROM orders WHERE customerid = @CustID END 

तेज़ तरीका:

 CREATE PROCEDURE GetOrderForCustomersWithoutPS(@CustID varchar(20)) AS BEGIN DECLARE @LocCustID varchar(20) SET @LocCustID = @CustID SELECT * FROM orders WHERE customerid = @LocCustID END 

उम्मीद है कि यह किसी और को मदद करता है, ऐसा करने से मेरा निष्पादन समय 5+ मिनट से घटाकर लगभग 6-7 सेकेंड हो गया।

मुझे समस्या मिली, यहां संग्रहीत कार्यविधि के धीमे और तेज़ संस्करणों की स्क्रिप्ट है:

dbo.ViewOpener__RenamedForCruachan__Slow.PRC

 SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE dbo.ViewOpener_RenamedForCruachan_Slow @SessionGUID uniqueidentifier AS SELECT * FROM Report_Opener_RenamedForCruachan WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 

dbo.ViewOpener__RenamedForCruachan__Fast.PRC

 SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO CREATE PROCEDURE dbo.ViewOpener_RenamedForCruachan_Fast @SessionGUID uniqueidentifier AS SELECT * FROM Report_Opener_RenamedForCruachan WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 

अगर आपने अंतर नहीं देखा, तो मैं आपको दोष नहीं देता। अंतर सभी को संग्रहीत कार्यप्रणाली में नहीं है इस अंतर में 0.5 लाख की लागत वाली एक तेजी से पूछताछ हो जाती है जो 6 मिलियन पंक्तियों की उत्सुक स्पूल करता है:

धीमा: SET ANSI_NULLS OFF

फास्ट: SET ANSI_NULLS ON


इस उत्तर को भी समझने के लिए बनाया जा सकता है, क्योंकि इस दृश्य में शामिल होने वाले खंड का कहना है:

 (table.column IS NOT NULL) 

तो इसमें कुछ NULL शामिल है


क्वेरी विश्लेषक पर वापस लौटने और आगे चलकर स्पष्टीकरण साबित होता है

 SET ANSI_NULLS OFF 

 DECLARE @SessionGUID uniqueidentifier SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908' 

 SELECT * FROM Report_Opener_RenamedForCruachan WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank 

और क्वेरी धीमा है


इसलिए समस्या यह नहीं है कि क्वेरी को संग्रहीत कार्यविधि से चलाया जा रहा है। समस्या यह है कि एंटरप्राइज़ प्रबंधक का कनेक्शन डिफ़ॉल्ट विकल्प ANSI_NULLS off , बजाय ANSI_NULLS on , जो क्यूए के डिफ़ॉल्ट है।

माइक्रोसॉफ्ट KB296769 में इस तथ्य को स्वीकार करता है ( बुग : एसक्यूएल एंटरप्राइज प्रबंधक का उपयोग लिंक किए गए सर्वर ऑब्जेक्ट्स से युक्त संग्रहीत प्रक्रियाओं को बनाने के लिए नहीं किया जा सकता) समाधान में संग्रहीत कार्यविधि में ANSI_NULLS विकल्प शामिल है:

 Set ANSI_NULLS ON Go Create Proc spXXXX as .... 

अपने डेटाबेस के लिए यह करो मेरे पास एक ही समस्या है – यह एक डेटाबेस में ठीक काम करता है, लेकिन जब मैं SSIS आयात (सामान्य पुनरारंभ नहीं) का उपयोग करते हुए इस डेटाबेस को दूसरे को कॉपी करता हूं, तो यह समस्या मेरी अधिकांश संग्रहीत कार्यविधियों के लिए होती है तो कुछ और Googling के बाद, मैं Pinal डेव का ब्लॉग मिला (जो बीटीडब्ल्यू, मैं अपने पद का सबसे सामना किया और मुझे बहुत धन्यवाद धन्यवाद Pinal डेव) ।

मैं अपने डेटाबेस पर नीचे की क्वेरी निष्पादित करता हूं और यह मेरी समस्या को ठीक करता है:

 EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)" GO EXEC sp_updatestats GO 

उम्मीद है की यह मदद करेगा। बस उन लोगों की मदद से गुजर रहा था जिन्होंने मेरी मदद की

इस बार आपको आपकी समस्या मिली यदि अगली बार आप कम भाग्यशाली हैं और इसे समझ नहीं सकते, तो आप योजना को फ्रीज करने और गलत निष्पादन योजना के बारे में चिंता करने से रोक सकते हैं।

मैं इस समस्या का सामना कर रहा था मेरी क्वेरी कुछ ऐसा देखा:

 select a, b, c from sometable where date > '20140101' 

मेरी संग्रहीत प्रक्रिया की तरह परिभाषित किया गया था:

 create procedure my_procedure (@dtFrom date) as select a, b, c from sometable where date > @dtFrom 

मैंने डेटटाइप को डेटटाइम और वॉयला में बदल दिया! 30 मिनट से 1 मिनट तक चला गया!

 create procedure my_procedure (@dtFrom datetime) as select a, b, c from sometable where date > @dtFrom 

मुझे एक ही मुद्दे का सामना करना पड़ रहा था और यह पोस्ट मेरे लिए बहुत सहायक थी लेकिन पोस्ट किए गए किसी भी उत्तर ने मेरे विशिष्ट मुद्दे को हल नहीं किया। मैं उस समाधान को पोस्ट करना चाहता था जो उम्मीदों में मेरे लिए काम करता था कि वह किसी और की मदद कर सकता है

https://stackoverflow.com/a/24016676/814299

आपकी क्वेरी के अंत में, OPTION जोड़ें (ऑप्टिमाइज़ के लिए (यहां पर अज्ञात)

क्या आपने Report_Opener तालिका पर आंकड़े और / या अनुक्रमणिका को पुनर्निर्माण करने की कोशिश की है सपा के सभी recomplies के लायक नहीं होगा अगर आंकड़े अभी भी जब डेटाबेस पहले inauguarated था से डेटा प्रदर्शित करते हैं।

प्रारंभिक क्वेरी ही जल्दी से काम करता है क्योंकि ऑप्टिमाइज़र यह देख सकता है कि पैरामीटर कभी भी रिक्त नहीं होगा। एसपी के मामले में ऑप्टिमाइज़र यह सुनिश्चित नहीं कर सकता है कि पैरामीटर कभी भी रिक्त नहीं होगा।

हालांकि मैं आम तौर से इसके खिलाफ हूं (हालांकि इस मामले में ऐसा लगता है कि आपके पास वास्तविक कारण है), क्या आपने क्वेरी के एसपी संस्करण पर कोई प्रश्न संकेत उपलब्ध कराने की कोशिश की है? यदि SQL सर्वर उन दो उदाहरणों में एक अलग निष्पादन योजना तैयार कर रहा है, तो क्या आप यह संकेत देने के लिए संकेत का उपयोग कर सकते हैं कि किस सूचकांक का उपयोग किया जाए, ताकि योजना पहले से मेल हो?

कुछ उदाहरणों के लिए, आप यहां जा सकते हैं ।

संपादित करें: यदि आप अपनी क्वेरी योजना यहां पोस्ट कर सकते हैं, तो शायद हम बताए गए योजनाओं के बीच कुछ अंतर की पहचान कर सकते हैं।

दूसरा: SQL-2000 विशिष्ट होने के लिए लिंक को अपडेट किया गया। आपको एक तरीकों को नीचे स्क्रॉल करना होगा, लेकिन "टेबल संकेत" नाम वाला दूसरा शीर्षक है जो आप के लिए देख रहे हैं।

THIRD: "खराब" क्वेरी "Iphone_Openers_SessionGUID" को "ओपनर्स" तालिका पर नज़रअंदाज़ करते हुए लगता है – कोई भी इंडेक्स का उपयोग करने के लिए उस इंडेक्स को चीजों को बदलने के लिए बाध्य करने के लिए कोई भी संकेत जोड़ना होगा?

यह संभवत: संभव नहीं है, लेकिन यह देखते हुए कि आपके व्यवहार का व्यवहार असामान्य है, इसकी जांच की जानी चाहिए और किसी और ने इसका उल्लेख नहीं किया है।

क्या आप वाकई यह सुनिश्चित कर रहे हैं कि सभी ऑब्जेक्ट्स डीबो के स्वामित्व में हैं और आपके पास कोई नकली प्रतियां नहीं हैं, जो आपके द्वारा स्वामित्व वाली हैं या एक अलग उपयोगकर्ता मौजूद हैं?

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

ध्यान दें कि पाठ में आप मालिक को निर्दिष्ट किए बिना कुछ चीजें चला रहे हैं, उदा

 sp_recompile देखेंऑपरनर

अगर उदाहरण के लिए जहां डीओबी के स्वामित्व वाले दृश्यऑपरनर की दो प्रतियां और [कुछ अन्य प्रयोक्ता] तब जो आप वास्तव में पुनः कंपाइल करते हैं यदि आप निर्दिष्ट नहीं करते हैं तो परिस्थितियों पर निर्भर है रिपोर्ट_ऑपरनर दृश्य के साथ-साथ – यदि वहां दो प्रतियां (और वे विनिर्देश या निष्पादन योजना में भिन्न हो सकती हैं) तो इसका उपयोग क्या होता है, हालाँकि परिस्थितियों पर निर्भर करता है – और जैसा कि आप स्वामी निर्दिष्ट नहीं करते हैं, यह पूरी तरह से संभव है कि आपकी एडहॉक क्वेरी एक और संकलित प्रक्रिया दूसरे का इस्तेमाल कर सकती है

जैसा कि मैंने कहा, यह संभवतः संभव नहीं है लेकिन यह संभव है और जांच की जानी चाहिए क्योंकि आपके मुद्दे हो सकते हैं कि आप बस गलत जगह में बग की तलाश कर रहे हैं।

यह मूर्खतापूर्ण लग सकता है और नाम SessionGUID से स्पष्ट लगता है, लेकिन क्या Report_Opener पर कॉलम एक अनोखा पहचान है? यदि नहीं, तो आप इसे सही प्रकार के रूप में चलाने का प्रयास कर सकते हैं और इसे एक शॉट दे सकते हैं या अपने प्रकार को सही प्रकार में घोषित कर सकते हैं।

स्प्रेक के हिस्से के रूप में बनाई गई योजना अनजाने में काम कर सकती है और बड़ी टेबल पर एक आंतरिक डाली कर सकती है

मुझे एक और विचार मिल गया है यदि आप इस तालिका-आधारित फ़ंक्शन बनाते हैं तो क्या होगा:

 CREATE FUNCTION tbfSelectFromView ( -- Add the parameters for the function here @SessionGUID UNIQUEIDENTIFIER ) RETURNS TABLE AS RETURN ( SELECT * FROM Report_Opener WHERE SessionGUID = @SessionGUID ORDER BY CurrencyTypeOrder, Rank ) GO 

और फिर निम्न कथन (यहां तक ​​कि इसे अपने सपा में डालकर) का उपयोग करके इसे चुना गया है:

 SELECT * FROM tbfSelectFromView(@SessionGUID) 

ऐसा लगता है कि क्या हो रहा है (जिस पर पहले से ही टिप्पणी की गई है) यह है कि SQL सर्वर बस किसी गलती को कहीं गलत बनाता है, और हो सकता है कि यह धारणा को सही करने के लिए बाध्य करे। मुझे अतिरिक्त कदम जोड़ने से नफरत है, लेकिन मुझे यकीन नहीं है कि इससे क्या हो सकता है।

आज सुबह मुझे एक ही समस्या थी, बहुत अजीब था, एक क्लासिक एएसपी पेज जो एक स्टोर्ड प्रोक चलाता है 1 मिनट + ले रहा था एएसएस पेज चल रहा था एसएसपी 2 सेकंड में एमएसएसएमएस में चला गया … निष्पादन योजनाओं की जांच के लिए उम्र की व्यय करने से पहले मैंने सोचा था कि मैं सिर्फ एक एसटी के लिए अल्टर प्रक्रिया (एक टिप्पणी पंक्ति) डालेगा। ALTER स्टेटमेंट चलाने के बाद, सपा ने आईआईएस और एमएसएसएमएस दोनों में तत्काल निष्पादित किया। मैं एसपी के मानक पुनः कंपाइल को अनुमान लगाता हूं कि यह चाल होनी चाहिए: (जिस तरह से यहां पर पुनः कंपाइलिंग के बारे में अच्छी जानकारी है 🙂

http://www.devx.com/tips/Tip/13386

संबंधित तालिकाओं पर अनुक्रमित पुनर्निर्माण के लिए मुझे इस समस्या के माध्यम से मदद मिली

– यह समाधान है:

 create procedure GetOrderForCustomers(@CustID varchar(20)) as begin select * from orders where customerid = ISNULL(@CustID, '') end 

— बस