अधिकतम व्यापक के लिए सिस्टम वाइड डिफ़ॉल्ट बदलें


12

मैं सिस्टम-वाइड डिफ़ॉल्ट मान को कैसे बदलूं MAXRECURSION?

डिफ़ॉल्ट रूप से यह 100 है, लेकिन मुझे इसे 1000 की तरह कुछ बढ़ाने की आवश्यकता है।

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

हालाँकि, मेरे पास सर्वर उदाहरण पर व्यवस्थापक अधिकार हैं। मैं सर्वर पहलुओं में चारों ओर पिस रहा हूं, लेकिन मुझे क्वेरी विकल्प या पुनरावृत्ति से संबंधित कुछ भी दिखाई नहीं देता है। मुझे लगता है वहाँ है एक जगह कहीं जहाँ मैं पूरे सिस्टम में डिफ़ॉल्ट अद्यतन कर सकते हैं हो सकता है।

कोई विचार?


3
मैं सिर्फ यह जांचना चाहता था कि क्या आप समझ सकते हैं कि 100 की सीमा केवल विचारों और कार्यों पर थी और आप एक संग्रहीत प्रक्रिया का उपयोग कर सकते हैं और स्थानीय स्तर पर वहां से बाहर आ सकते हैं? क्या किसी फ़ंक्शन का उपयोग करने की कोई विशेष आवश्यकता है? जैसा कि पुनरावृत्ति काफी अक्षम है, मैंने केवल एक बार पदानुक्रम चलने और एक तालिका में आउटपुट संग्रहीत करने का सुझाव भी दिया। आप तब एक फ़ंक्शन बना सकते हैं जो उस तालिका के लिए भेजा गया हो। तुम क्या सोचते हो?
डब्ल्यूएक्यू

जवाबों:


10

यदि आपके प्रश्नों का एक सामान्य आकार है, तो आप एक या अधिक योजना गाइडों का उपयोग करके आवश्यक अधिकतम वेतन वृद्धि संकेत जोड़ने में सक्षम हो सकते हैं।

उन्हें सही करने के लिए एक आदत हो सकती है। यदि आप अपने प्रश्न में विशिष्ट क्वेरी विवरण जोड़ते हैं, तो हम आपके लिए काम कर सकते हैं। आमतौर पर, आप वास्तव में सर्वर से टकराने वाले SQL को ट्रेस करेंगे, या बिल्ट-इन प्रक्रिया sys.sp_get_query_template का उपयोग करके एक पैरामीटर फॉर्म प्राप्त करेंगे , और उसके बाद एक TEMPLATE और / या OBJECT / SQL सर्वर गाइड बना सकते हैं।

अधिक जानकारी के लिए दस्तावेज देखें:

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

ध्यान दें कि sys.fn_validate_plan_guide का उपयोग करके योजना सत्यापन को गलत तरीके से एक विफलता की रिपोर्ट कर सकते हैं यदि निर्देशित कथन एक अस्थायी तालिका का संदर्भ देता है। इस प्रश्न को देखें:

Fn_validate_plan_guide के साथ योजना गाइड सत्यापन झूठी सकारात्मकता देता है

योजना गाइड सफल और योजना गाइड असफल प्रोफाइलर और विस्तारित घटनाक्रम कक्षाएं भी योजना गाइड अनुप्रयोगों की निगरानी के लिए इस्तेमाल किया जा सकता।

उत्पाद सुधार के सुझाव से पहले कनेक्ट को रिटायर कर दिया गया था। स्टीव कैस द्वारा विचारों और यूडीएफ के लिए 100 से अधिक की अधिकतम सीमा की अनुमति दी गई थी। यदि आप इसे अभी Microsoft के साथ लेना चाहते हैं, तो SQL सर्वर मदद और प्रतिक्रिया के विकल्प देखें ।


यह निराशाजनक है और दस्तावेज के एक खरगोश छेद में हमें दफनाने के बजाय सवाल का जवाब नहीं देता है। ईएफ कोर (एक सामान्य ओआरएम) आपके लिए प्रश्न उत्पन्न करता है भले ही आप इसे एक कच्चा एसक्यूएल बयान देते हैं यह लपेटता है कि माता-पिता के चयन में, ईएफ कोर का उपयोग करने वाले किसी को भी यह समस्या है। आपका समाधान है "अपने प्रश्नों की योजना बनाएं"।
वार

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

9

यदि आपको पूरी तरह से एक फ़ंक्शन (अपने ईटीएल उपकरण की एक सीमा जैसा कि आप कहते हैं) का उपयोग करना होगा, तो आप OPTIONएक बहु-स्टेटमेंट टेबल-वैल्यू फ़ंक्शन के हिस्से के रूप में निर्दिष्ट कर सकते हैं , जैसे कुछ इस तरह से:

CREATE FUNCTION dbo.udf_MyFunction ( @StartID INT ) 
RETURNS @tv TABLE
(
id INT
)
AS
BEGIN

    WITH Episodes( xlevel, PersonID, EventID, EpisodeID, StartDT, EndDT ) AS (
    -- Anchor case - the first EventID for each person.
    SELECT 1 AS xlevel, PersonID, EventID, @StartID, StartDT, EndDT 
    FROM dbo.EventTable
    WHERE EventID = @StartID

    UNION ALL

    SELECT xlevel + 1, et.PersonID, et.EventID, c.EventID + 1, et.StartDT, et.EndDT
    FROM Episodes c
        INNER JOIN dbo.EventTable et ON c.PersonID = et.PersonID
            AND et.EventID = c.EventID + 1
    --WHERE c.EventID <= (@StartID + 99)
    )
    INSERT INTO @tv
    SELECT PersonID
    FROM Episodes
    OPTION ( MAXRECURSION 1000 )

    RETURN

END
GO

जब आप अपने ETL उपकरण का सुझाव देते हैं, तो यह मेरे लिए भी एक दृश्य में लिपटा होता है। इस सिस्टम-वाइड को बदलने का कोई तरीका नहीं है, लेकिन जैसा कि पुनरावृत्ति अक्षम हो सकता है, यह संभवतः एक अच्छी बात है। आप OPTIONएक इनलाइन तालिका-मूल्यवान फ़ंक्शन के शरीर के भीतर एक क्वेरी संकेत (उपयोग ) निर्दिष्ट नहीं कर सकते , जैसा कि आपके उदाहरण में।

जब आप अपने एपिसोड प्राप्त करते हैं तो पदानुक्रम चलने के लिए अपनी प्रक्रिया को बदलने पर विचार करें और आउटपुट को संबंधपरक तालिका में संग्रहीत करें। आप ऐसा करने के लिए एक संग्रहित खरीद का उपयोग कर सकते हैं ताकि इस सीमा में न चला जाए।

मुझे भी लगता है कि आपके कोड में एक बग हो सकता है: यदि आपका CTE personId पर जुड़ता है और EventId पर पुन: जुड़ता है, तो EventId 101 मैं दो बार प्रस्तुत करता हूं, मुझे एक डुप्लिकेट के रूप में लगता है। संभवतः मैंने आपके कोड की गलत व्याख्या की है, मुझे बताएं कि आप क्या सोचते हैं।

HTH


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

0

मैंने इस विषय से प्रेरणा ली ।

यहाँ मैंने समस्या को हल करने के लिए क्या किया है।

CREATE FUNCTION MySchema.udf_MyFunction(@StartID INT) 
RETURNS TABLE 
AS RETURN
WITH
Episodes(PersonID, EventID, EpisodeID, StartDT, EndDT) AS (
  -- Anchor case - the first EventID for each person.
  SELECT PersonID, EventID, @StartID, StartDT, EndDT 
  FROM MySchema.EventTable
  WHERE EventID = @StartID
UNION ALL
  SELECT
    ...
  WHERE
    EventID <= (@StartID + 99)
)
SELECT * FROM Episodes

फिर मैं इस समारोह को इस तरह से आमंत्रित करता हूं:

WITH
Episodes AS (
  SELECT * FROM MySchema.udf_MyFunction(1)
UNION ALL
  SELECT * FROM MySchema.udf_MyFunction(101)
UNION ALL
  SELECT * FROM MySchema.udf_MyFunction(201)
-- ...
UNION ALL
  SELECT * FROM MySchema.udf_MyFunction(901)
)
SELECT * FROM Episodes

इस तरह, मेरे सीटीई तर्क में से किसी को भी दोहराया नहीं जाना है और मैं प्रदर्शन के मामले में कुछ भी अतिरिक्त भुगतान नहीं करता हूं। यह एक उपद्रव है कि इसे इस तरह से करना है, लेकिन मैं इसके साथ रह सकता हूं।


3
मैं नहीं देखता कि यह कैसे एक पुनरावृत्ति समस्या हल करता है। फ़ंक्शन का आमंत्रण पुनरावर्ती नहीं है।
ypercube y

@ ypercube y - CTE का पुनरावर्ती बिट जाता है जहां मेरे पास मेरा इलिप्सिस है - मेरा विशेष पुनरावर्ती तर्क वास्तव में समस्या के लिए प्रासंगिक नहीं है, लेकिन आप यह मान सकते हैं कि सीटीई वास्तव में, पुनरावर्ती है। whereदीर्घवृत्त के बाद का खंड बहुत अधिक पुनरावृत्तियों को अवरोधक के रूप में फ़ंक्शन पैरामीटर का उपयोग करने से रोकता है। मुझे लगता है कि सीटीई की परिभाषा के बाद एक बयान होना चाहिए , हालांकि। मैं जोड़ दूंगा।
carl.anderson

3
मैं अच्छी तरह से समझता हूं कि सीटीई पुनरावर्ती है। समस्या यह है कि आह्वान (फ़ंक्शन कॉल) पुनरावर्ती नहीं हैं । उदाहरण के लिए, आप EventID=1(और 101,201, ... 901) के साथ शुरुआती बिंदुओं (पंक्तियों) के साथ फ़ंक्शन कहते हैं । लेकिन मूल क्वेरी (यदि MAXRECURSION = 100000000 के साथ चलती है) कभी भी पंक्ति के साथ नहीं जा सकती EventID=101(और 201, .., 901)। तो दो प्रश्न (मूल और आपका समाधान) अलग-अलग परिणाम (पहले में 101 के साथ कोई पंक्ति नहीं, हाँ में 2) वापस कर सकते हैं! या यह 101 पर जा सकता है, लेकिन चरण 100 से पहले, इसलिए आपके समाधान में परिणाम में दो बार पंक्ति शामिल होगी (फिर से अलग)
ypercube16

2
जब तक कि डेटा थोरूग अनुक्रमिक ईवेंटआईडी मान (1,2, 3, ..., 99,100,101, ..) से जुड़े हुए हैं। जिस स्थिति में, आपको एक पुनरावर्ती CTE की आवश्यकता नहीं होगी।
ypercube y

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