ম্যাক্সেকার্সনের জন্য সিস্টেমের প্রশস্ত ডিফল্ট পরিবর্তন করুন


12

কীভাবে আমি সিস্টেম-প্রশস্ত ডিফল্ট মানটির পরিবর্তন করব MAXRECURSION?

ডিফল্টরূপে এটি 100, তবে আমার এটি 1000 এর মতো কিছুতে বাড়ানো দরকার।

আমি কোয়েরি ইঙ্গিতগুলি ব্যবহার করতে পারছি না যেহেতু আমি এমন একটি প্রোগ্রাম ব্যবহার করছি যা আমার ক্যোয়ারী গ্রহণ করে এবং এটি আমার জন্য কার্যকর করে এবং দুর্ভাগ্যক্রমে আমি এই সীমাবদ্ধতাটি পেতে পারি না।

তবে সার্ভারের দৃষ্টান্তে আমার অ্যাডমিন অধিকার রয়েছে। আমি সার্ভারের দিকগুলি দেখেছি কিন্তু কোয়েরি বিকল্পগুলি বা পুনরাবৃত্তির সাথে সম্পর্কিত কিছুই দেখতে পাচ্ছি না। আমি অনুমান সেখানে রয়েছে একটি জায়গা কোথাও যেখানে আমি সিস্টেম-ব্যাপী ডিফল্ট আপডেট করতে পারেন যাবে।

কোন ধারনা?


3
আমি কেবল 100 টির সীমাবদ্ধতাটি কেবলমাত্র দৃষ্টিভঙ্গি এবং ফাংশনগুলিতেই বুঝতে পেরেছি তা পরীক্ষা করতে চেয়েছিলাম এবং আপনি সেখানে কোনও সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন এবং স্থানীয়ভাবে ওভাররাইড করতে পারেন? কোন ফাংশন ব্যবহার করার কি কোনও বিশেষ প্রয়োজন আছে? পুনরাবৃত্তি যেহেতু মোটামুটি অকার্যকর, তাই আমি কেবল একবার স্তরক্রমকে হাঁটতে এবং আউটপুটটি একটি টেবিলের মধ্যে সঞ্চয় করার পরামর্শ দিয়েছিলাম। তারপরে আপনি কোনও ফাংশন তৈরি করতে পারেন যা সেই টেবিলটিকে উল্লেখ করেছে। আপনি কি মনে করেন?
ডাব্লুবিবি

উত্তর:


10

আপনার প্রশ্নের যদি একটি সাধারণ আকার থাকে তবে আপনি এক বা একাধিক পরিকল্পনার গাইড ব্যবহার করে প্রয়োজনীয় ম্যাক্সারক্রিশন ইঙ্গিতটি যুক্ত করতে সক্ষম হতে পারেন।

সেগুলি সঠিকভাবে অর্জন করার জন্য কোনও নকশাক থাকতে পারে। আপনি যদি আপনার প্রশ্নের নির্দিষ্ট সন্ধানের বিশদ বিবরণ যোগ করেন তবে আমরা আপনার জন্য এটি কার্যকর করতে সক্ষম হতে পারি। সাধারণত, আপনি এসকিউএলটি আসলে সার্ভারটিতে হিট করতে বা অন্তর্নির্মিত পদ্ধতি sys.sp_get_query_template ব্যবহার করে একটি প্যারামিটারাইজড ফর্ম সংগ্রহ করতে পারবেন এবং তারপরে একটি টেম্পলেট এবং / অথবা OBJECT / এসকিউএল পরিকল্পনা গাইড তৈরি করবেন।

আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন:

যখনই অ্যাপ্লিকেশন কোড পরিবর্তন হবে এবং যখন এসকিউএল সার্ভারটি প্যাচড বা আপগ্রেড করা হবে তখন প্ল্যান গাইডগুলিকে পুনরায় আইন প্রয়োগ করতে হবে। এটি কেবল আপনার সাধারণ পরীক্ষার চক্রের অংশ হওয়া উচিত।

নোট করুন যে sys.fn_ માન્યate_plan_guide ব্যবহার করে পরিকল্পনার গাইড বৈধতা ভুলভাবে একটি ব্যর্থতার রিপোর্ট করতে পারে যদি গাইডের বিবৃতিটি একটি অস্থায়ী সারণিকে উল্লেখ করে। এই প্রশ্নটি দেখুন:

Fn_omotate_plan_guide সহ প্ল্যান গাইডের বৈধতা মিথ্যা ধনাত্মক দেয়

পরিকল্পনা গাইড সফল এবং পরিকল্পনা গাইড অসফল প্রোফাইলার এবং এক্সটেন্ডেড ঘটনাবলী শ্রেণীর এছাড়াও পরিকল্পনা নির্দেশিকা অ্যাপ্লিকেশন নিরীক্ষণ করতে ব্যবহৃত হতে পারে।

স্টিভ কাসের দর্শন ও ইউডিএফগুলির জন্য 100 টির চেয়ে বেশি MAXRECURSION সীমা মানকে মঞ্জুরি দেওয়ার আগে পণ্যের উন্নতির পরামর্শের আগে কানেক্টকে অবসর দেওয়া হয়েছিল। আপনি যদি এখনই এটি মাইক্রোসফ্টের সাথে নিতে চান তবে এসকিউএল সার্ভারের সহায়তা এবং প্রতিক্রিয়া দেখুন


এটি হতাশাব্যঞ্জক এবং ডকুমেন্টেশনের খরগোশের গর্তে আমাদের কবর দেওয়ার পরিবর্তে প্রশ্নের উত্তর দেয় না। ইএফ কোর (একটি সাধারণ ওআরএম) আপনার জন্য অনুসন্ধান তৈরি করে এমনকি যদি আপনি এটি কোনও কাঁচা এসকিউএল বিবৃতি দেন তবে এটি পিতামাতার মধ্যে নির্বাচন করে যে, ইএফ কোর ব্যবহার করে যে কেউ এই সমস্যায় আছে। আপনার সমাধানটি "আপনার প্রশ্নের পরিকল্পনা করুন"।
যুদ্ধ

@ ওয়ার এটি সরবরাহের বিশদ সহ আমি এই বিশেষ প্রশ্নের উত্তর দিতে পারি তার সেরা উত্তর। একমাত্র উপায় আমি জানি একটি যোগ করার জন্য সর্বোচ্চ পুনরাবৃত্তির ইঙ্গিত যেটি "আপনার প্রশ্ন পরিকল্পনা" সঙ্গে কিছুই করতে হয়েছে একটি পরিকল্পনা গাইড নামক একটি 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

আপনার ইটিএল সরঞ্জামগুলি করার পরামর্শ দেওয়ার সাথে সাথে এটি দৃশ্যে আবৃত অবস্থায়ও আমার পক্ষে কাজ করেছিল। এই সিস্টেম-ব্যাপী কোনও পরিবর্তন করার কোনও উপায় নেই, তবে পুনরাবৃত্তি যেমন অক্ষম হতে পারে, সম্ভবত এটি খুব ভাল জিনিস। OPTIONআপনার উদাহরণ হিসাবে যেমন আপনি একটি ইনলাইন টেবিল-মূল্যবান ফাংশনটির শরীরে কোনও কোয়েরি ইঙ্গিত (ব্যবহার করে ) নির্দিষ্ট করতে পারবেন না ।

যখন আপনি আপনার এপিসোডগুলি গ্রহণ করেন এবং আংশিক সারণীতে আউটপুট সংরক্ষণ করেন কেবল তখনইক্রমক্রমকে হাঁটাতে আপনার প্রক্রিয়াটি পরিবর্তনের বিষয়ে বিবেচনা করুন। এটি করার জন্য আপনি কোনও সঞ্চিত প্রোক ব্যবহার করতে পারেন তাই এটি এই সীমাবদ্ধতার মধ্যে চলে না।

আমিও মনে করি আপনার কোডে কোনও ত্রুটি থাকতে পারে: আপনার সিটিই যদি ব্যক্তির সাথে যোগ হয় এবং ইভেন্ট আইডে পুনরাবৃত্তি করে, ইভেন্ট 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ᵀᴹ

@ ইয়পারক्यूबᵀᴹ - সিটিইর পুনরাবৃত্ত বিটটি যেখানে আমার উপবৃত্ত রয়েছে - সেখানে আমার নির্দিষ্ট পুনরাবৃত্ত যুক্তি সমস্যাটির সাথে সত্যিই প্রাসঙ্গিক নয় তবে আপনি ধরে নিতে পারেন যে সিটিই বাস্তবে পুনরাবৃত্ত হয়। whereদফা ঊহ্য শব্দ পরে একটি বাধ্যতা যেমন ফাংশন প্যারামিটার ব্যবহার করে ঘটা থেকে অনেকগুলি recursions বাধা দেয়। আমার ধারণা , যদিও সিটিই সংজ্ঞার পরে একটি বিবৃতি থাকা উচিত । আমি এটি যোগ করব।
carl.anderson

3
আমি খুব ভাল করে বুঝতে পারি যে সিটিই পুনরাবৃত্ত হয়। সমস্যাটি হ'ল অনুরোধ (ফাংশন কল) পুনরাবৃত্ত হয় না । উদাহরণস্বরূপ, আপনি EventID=1(এবং 101,201, ... 901) দিয়ে সূচনা পয়েন্ট (সারি) সহ ফাংশনগুলিকে কল করেন । তবে মূল ক্যোয়ারী (যদি MAXRECURSION = 100000000 দিয়ে চালানো হয়) কখনই EventID=101(এবং 201, .., 901) দিয়ে সারিটি দেখতে পাবে না । সুতরাং দুটি ক্যোয়ারী (আসল এবং আপনার সমাধান) বিভিন্ন ফলাফল দিতে পারে (প্রথমটিতে 101 এর সাথে কোনও সারি নেই, হ্যাঁ 2 য়!)! অথবা এটি ১০১ এর পূর্বে যেতে পারে তবে ১০০ ধাপের আগে, যাতে আপনার সমাধানটি সারিতে দু'বার ফলাফলগুলিতে অন্তর্ভুক্ত করবে (আবার ভিন্ন)
ypercubeᵀᴹ

2
অবশ্যই অবধি ডেটা সংযোগযুক্ত তাত্ত্বিক ক্রমযুক্ত ইভেন্ট আইডিআইডি মানগুলি (1,2,, 3 ..., 99,100,101, ..)। কোন ক্ষেত্রে আপনার কোনও পুনরাবৃত্ত সিটিই লাগবে না।
ypercubeᵀᴹ

এটি কীভাবে অজানা গভীরতার সমস্যাটির সমাধান করবে ... যেমন কোনও রোমসেট হিসাবে প্রদত্ত ডিএমএস পথ থেকে একটি গাছ পেয়ে?
যুদ্ধ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.