MERGE টেম্পডিবি ব্যবহার করে?


12

নিম্নলিখিত কোয়েরি বিবেচনা করুন:

MERGE [Parameter] with (rowlock) AS target
    USING (SELECT @AreaId, @ParameterTypeId, @Value)
            AS source (AreaId, ParameterTypeId, Value)
    ON (target.AreaId = source.AreaId AND 
        target.ParameterTypeId = source.ParameterTypeId)
    WHEN MATCHED THEN 
        UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
    WHEN NOT MATCHED THEN
        INSERT ([AreaId], [ParameterTypeId], [Value])
        VALUES (source.AreaId, source.ParameterTypeId, source.Value);

পরিসংখ্যান I / O নিম্নলিখিত আউটপুট দেয়:

সারণী 'প্যারামিটারটাইপ'। স্ক্যান কাউন্ট 0, লজিকাল রিডস 2, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0
টেবিল 'এরিয়া' ' স্ক্যান গণনা 0, লজিকাল রিডস 2, ফিজিকাল রিডস 0, রিড-ফরোয়ার্ড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0
টেবিল 'প্যারামিটার'। স্ক্যান কাউন্ট 1, লজিকাল রিডস 4, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-
ফরোয়ার্ড 0 টেবিল 'ওয়ার্কটেবল'। স্ক্যান কাউন্ট 1, লজিকাল রিড 0, ফিজিকাল রিড 0, রিড-ফরোডড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0

ওয়ার্কটেবল বার্তাগুলি ট্যাবে উপস্থিত হয় যা আমাকে ভাবায় যে টেম্পডিবি ব্যবহার করছে MERGE

আমি এক্সিকিউশন পরিকল্পনায় এমন কোনও কিছুই দেখছি না যা টেম্পডিবির প্রয়োজন বোঝায়

না MERGEসবসময় tempdb ব্যবহার করবেন?

বিওএল-তে এমন কিছু আছে যা এই আচরণটি ব্যাখ্যা করে?

এই পরিস্থিতিতে ব্যবহার INSERTএবং UPDATEদ্রুত হতে হবে?

বাম

এখানে চিত্র বর্ণনা লিখুন

অধিকার

এখানে চিত্র বর্ণনা লিখুন

এখানে টেবিল কাঠামো

এখানে চিত্র বর্ণনা লিখুন


পরিকল্পনার স্পুলটি একটি ওয়ার্কটেবল tempdb। এটি একটি একক সারির জন্য যদিও এটি দেখতে অদ্ভুত বলে মনে হচ্ছে। আমার ধারণা হ্যালোইন সুরক্ষার জন্য এটি সেখানে থাকতে পারে।
মার্টিন স্মিথ

এখন বুঝতে পারছি. রিওয়াইন্ডগুলি অনুকূল করে তোলার জন্য ইনপুট থেকে ডেটা অস্থায়ী টেবিলের মধ্যে সঞ্চয় করে।
ক্রেগ এফ্রেইন

উত্তর:


8

(প্রশ্নে আমার মন্তব্যে প্রসারিত))

সমন্বয় একটি অনন্য বাধ্যতা ছাড়া AreaIdএবং ParameterTypeIdদেওয়া কোড নষ্ট হয়ে গেছে কারণ @UpdatedId = target.Idশুধুমাত্র কখনও একটি একক সারি রেকর্ড করব Id

আপনি এটি না বললে এসকিউএল সার্ভার স্পষ্টভাবে ডেটার সম্ভাব্য অবস্থাগুলি জানতে পারে না। হয় সীমাবদ্ধতা প্রয়োগ করা উচিত, বা একাধিক সারি বৈধ হলে Idমানগুলি আউটপুট দেওয়ার জন্য একটি ভিন্ন পদ্ধতি ব্যবহার করার জন্য কোডটি পরিবর্তন করা দরকার be

স্ক্যান অপারেটর একাধিক মিলের সারিগুলি জুড়ে আসার সম্ভাবনার কারণে, ক্যোরিয়াকে অবশ্যই হ্যালোইন সুরক্ষার জন্য সমস্ত ম্যাচ স্পুল করতে হবে। হিসাবে মন্তব্য নির্দেশিত, বাধ্যতা হয় , বৈধ তাই এটি যোগ শুধুমাত্র একটি স্ক্যান থেকে পরিকল্পনা পরিবর্তন করতে হবে না চাওয়ার, কিন্তু টেবিল নাটাই প্রয়োজনীয়তা দূর, যেমন SQL সার্ভার বা জানবে সেখানে পারেন 0 হতে যাচ্ছে অপারেটরটির কাছ থেকে 1 টি সারি ফিরেছে।


6

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

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

যদিও আমি বলতে পারি না যে এটি আপনার ক্যোয়ারিতে কেস কিনা, কারণ আমি সূচী সংজ্ঞা (গুলি) জানি না, সম্ভবত এখানে এটি ঘটছে।

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