কোয়েরি উইন্ডোর তুলনায় কোনও অনুসন্ধান কেন একটি সঞ্চিত পদ্ধতিতে ধীর গতিতে চলে?


14

আমার একটি জটিল ক্যোয়ারী রয়েছে যা কোয়েরি উইন্ডোতে 2 সেকেন্ডের মধ্যে চলে তবে একটি সঞ্চিত পদ্ধতি হিসাবে প্রায় 5 মিনিট। কেন সঞ্চিত প্রক্রিয়া হিসাবে চালাতে এত বেশি সময় লাগছে?

আমার ক্যোয়ারীটি কেমন দেখাচ্ছে তা এখানে।

এটি রেকর্ডের একটি নির্দিষ্ট সেট ( @idএবং এটি দ্বারা চিহ্নিত @createdDate) এবং একটি নির্দিষ্ট সময় ফ্রেম (1 বছর থেকে শুরু করে @startDate) লাগে এবং সেই চিঠির ফলস্বরূপ প্রাপ্ত চিঠিগুলি এবং আনুমানিক পেমেন্টের সংক্ষিপ্ত তালিকা ফেরত দেয়।

CREATE PROCEDURE MyStoredProcedure
    @id int,
    @createdDate varchar(20),
    @startDate varchar(20)

 AS
SET NOCOUNT ON

    -- Get the number of records * .7
    -- Only want to return records containing letters that were sent on 70% or more of the records
    DECLARE @limit int
    SET @limit = IsNull((SELECT Count(*) FROM RecordsTable WITH (NOLOCK) WHERE ForeignKeyId = @id AND Created = @createdDate), 0) * .07

    SELECT DateSent as [Date] 
        , LetterCode as [Letter Code]
        , Count(*) as [Letters Sent]
        , SUM(CASE WHEN IsNull(P.DatePaid, '1/1/1753') BETWEEN DateSent AND DateAdd(day, 30, DateSent) THEN IsNull(P.TotalPaid, 0) ELSE 0 END) as [Amount Paid]
    INTO #tmpTable
    FROM (

        -- Letters Table. Filter for specific letters
        SELECT DateAdd(day, datediff(day, 0, LR.DateProcessed), 0) as [DateSent] -- Drop time from datetime
            , LR.LetterCode -- Letter Id
            , M.RecordId -- Record Id
        FROM LetterRequest as LR WITH (NOLOCK)
        INNER JOIN RecordsTable as M WITH (NOLOCK) ON LR.RecordId = M.RecordId
        WHERE ForeignKeyId = @id AND Received = @createdDate
            AND LR.Deleted = 0 AND IsNull(LR.ErrorDescription, '') = ''
            AND LR.DateProcessed BETWEEN @startDate AND DateAdd(year, 1, @startDate)
            AND LR.LetterCode IN ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o')
    ) as T
    LEFT OUTER JOIN (

        -- Payment Table. Payments that bounce are entered as a negative payment and are accounted for
        SELECT PH.RecordId, PH.DatePaid, PH.TotalPaid
        FROM PaymentHistory as PH WITH (NOLOCK)
            INNER JOIN RecordsTable as M WITH (NOLOCK) ON PH.RecordId = M.RecordId
            LEFT OUTER JOIN PaymentHistory as PR WITH (NOLOCK) ON PR.ReverseOfUId = PH.UID
        WHERE PH.SomeString LIKE 'P_' 
            AND PR.UID is NULL 
            AND PH.DatePaid BETWEEN @startDate AND DateAdd(day, 30, DateAdd(year, 1, @startDate))
            AND M.ForeignKeyId = @id AND M.Created = @createdDate
    ) as P ON T.RecordId = P.RecordId

    GROUP BY DateSent, LetterCode
    --HAVING Count(*) > @limit
    ORDER BY DateSent, LetterCode

    SELECT *
    FROM #tmpTable
    WHERE [Letters Sent] > @limit

    DROP TABLE #tmpTable

শেষ ফলাফলটি এরকম দেখাচ্ছে:

তারিখ লেটার কোড লেটারগুলি প্রেরিত পরিমাণ পরিশোধ করা হয়েছে
1/1/2012 এ 1245 12345.67
1/1/2012 খ 2301 1234.56
1/1/2012 সি 1312 7894.45
1/1/2012 এ 1455 2345.65
1/1/2012 সি 3611 3213.21

মন্দাটি কোথায় আছে তা নির্ণয় করতে আমার সমস্যা হচ্ছে, কারণ ক্যোয়ারী সম্পাদকটিতে সবকিছু খুব দ্রুত চলে। এটি কেবল তখনই যখন আমি ক্যোরিটিকে কোনও সঞ্চিত পদ্ধতিতে স্থানান্তর করি যা এটি চালাতে এত দীর্ঘ সময় শুরু করে।

আমি নিশ্চিত যে ক্যোয়ারী এক্সিকিউশন পরিকল্পনা উত্পন্ন হওয়ার সাথে এর কিছু করার আছে তবে আমি কী করব তা সমস্যা হতে পারে তা সনাক্ত করার জন্য এসকিউএল সম্পর্কে পর্যাপ্ত পরিমাণে জানি না।

সম্ভবত এটি লক্ষ করা উচিত যে ক্যোয়ারীতে ব্যবহৃত সমস্ত টেবিলের কয়েক মিলিয়ন রেকর্ড রয়েছে।

কেউ আমাকে ব্যাখ্যা করতে পারেন যে কোয়েরি সম্পাদকের তুলনায় এটি কেন সঞ্চিত পদ্ধতি হিসাবে চালাতে এত বেশি সময় নিচ্ছে, এবং আমার জিজ্ঞাসার কোন অংশটি কোনও সঞ্চিত প্রক্রিয়া হিসাবে চালানোর সময় পারফরম্যান্স সমস্যার কারণ হতে পারে তা সনাক্ত করতে আমাকে সহায়তা করতে পারে?


@ মার্টিনস্মিথ ধন্যবাদ আমি RECOMPILEইঙ্গিতটি এড়াতে পছন্দ করব যেহেতু আমি যখনই এটি চালাচ্ছিলাম তখনই সত্যই পুনরায় সংকলন করতে চাই না এবং আপনি যে নিবন্ধটি সংযুক্ত করেছেন তা উল্লেখ করেছে যে স্থানীয় ভেরিয়েবলের সাথে প্যারামিটারগুলি অনুলিপিটি ব্যবহারের সমতুল্য OPTIMIZE FOR UNKNOWN, যা কেবলমাত্র উপলব্ধ বলে মনে হয় ২০০৮ এবং তারপরে। আমি মনে করি আপাতত আমি স্থানীয় ভেরিয়েবলের সাথে অনুলিপি পরামিতিগুলি দিয়ে আটকে থাকব, যা আমার ক্যোয়ারী এক্সিকিউশন সময়টি আবার নীচে 1-2 সেকেন্ডে নামিয়ে আনবে।
রাচেল

উত্তর:


5

মার্টিন মন্তব্যগুলিতে যেমন উল্লেখ করেছেন , সমস্যাটি হ'ল ক্যোয়ারী একটি ক্যাশেড প্ল্যান ব্যবহার করছে যা প্রদত্ত প্যারামিটারগুলির জন্য অনুপযুক্ত।

অ্যাপ্লিকেশনটিতে স্লো ইন এসএসএমএসে তিনি যে লিঙ্কটি সরবরাহ করেছিলেন ? পারফরম্যান্স রহস্যগুলি বোঝা অনেকগুলি দরকারী তথ্য সরবরাহ করে যা আমাকে কিছু সমাধানের দিকে নিয়ে যায়।

আমি বর্তমানে যে সমাধানটি ব্যবহার করছি তা হ'ল পদ্ধতিতে স্থানীয় ভেরিয়েবলগুলিতে প্যারামিটারগুলি অনুলিপি করা, যা আমি মনে করি এসকিউএল এটি চালানোর সময় যে কোনও সময় এক্সিকিউশন প্ল্যানটির পুনরায় মূল্যায়ন করে তোলে, সুতরাং এটি ব্যবহারের পরিবর্তে প্রদত্ত প্যারামিটারগুলির জন্য সেরা এক্সিকিউশন প্ল্যানটি বেছে নেয় ক্যোয়ারির জন্য একটি অনুপযুক্ত ক্যাশেড প্ল্যান।

অন্যান্য সমাধানগুলি যা কাজ করতে পারে তা হ'ল OPTIMIZE FORবা RECOMPILEকোয়েরি ইঙ্গিতগুলি ব্যবহার করা ।


0

স্ট্যাকওভারফ্লোতে অনুরূপ প্রশ্ন থেকে ( আরও উত্তর সহ ), আপনার সঞ্চিত পদ্ধতিটি পরীক্ষা করুন।

  • বিএডি :SET ANSI_NULLS OFF (5 মিনিট, 6 এম আগ্রহী স্পুল)
  • ভাল :SET ANSI_NULLS ON (০.৫ সেকেন্ড)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.