নেতৃত্ব এবং পিছনে মানগুলি পেতে যোগ এবং উইন্ডো ফাংশন ব্যবহারের মধ্যে পারফরম্যান্স তুলনা


11

আমি 20M সারি সঙ্গে একটি টেবিল আছে, এবং প্রতিটি সারির 3 কলাম রয়েছে: time, id, এবং value। প্রত্যেকের জন্য idএবং time, একটি হল valueঅবস্থা। আমি একটি নির্দিষ্ট timeজন্য একটি নির্দিষ্ট সীসা এবং পিছনে মান জানতে চাই id

আমি এটি অর্জনে দুটি পদ্ধতি ব্যবহার করেছি। একটি পদ্ধতি যোগদানের ব্যবহার করছে ও অন্য পদ্ধতি জানালা ফাংশন নেতৃত্ব ব্যবহার করছে / উপর ক্লাস্টার সূচকের সাথে ধীরে ধীরে চলা timeএবং id

আমি এই দুটি পদ্ধতির কার্য সম্পাদনের সময় দ্বারা তুলনা করেছি। যোগদানের পদ্ধতিটি 16.3 সেকেন্ড সময় নেয় এবং উইন্ডো ফাংশন পদ্ধতিটি 20 সেকেন্ড সময় নেয়, সূচি তৈরির সময়টি অন্তর্ভুক্ত করে না। এটি আমাকে বিস্মিত করেছে কারণ উইন্ডোটির কার্যকারিতাটি উন্নত বলে মনে হচ্ছে যখন যোগদানের পদ্ধতিগুলি জোরদার।

দুটি পদ্ধতির কোড এখানে:

সূচি তৈরি করুন

create clustered index id_time
 on tab1 (id,time)

যোগদানের পদ্ধতি

select a1.id,a1.time
   a1.value as value, 
   b1.value as value_lag,
   c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time

আইও পরিসংখ্যানগুলি ব্যবহার করে উত্পন্ন SET STATISTICS TIME, IO ON:

যোগদানের পদ্ধতির পরিসংখ্যান

এখানে যোগদানের পদ্ধতির কার্যকরকরণ পরিকল্পনা রয়েছে

উইন্ডো ফাংশন পদ্ধতি

select id, time, value, 
   lag(value,1) over(partition by id order by id,time) as value_lag,
   lead(value,1) over(partition by id order by id,time) as value_lead
into tab2
from tab1

(কেবলমাত্র অর্ডার দেওয়ার timeফলে ০.৫ সেকেন্ডের সঞ্চয় হয়)

উইন্ডো ফাংশন পদ্ধতির কার্যকরকরণ পরিকল্পনা এখানে রয়েছে

আইও পরিসংখ্যান

[উইন্ডো ফাংশন পদ্ধতির পরিসংখ্যান 4]


আমি তথ্যটি পরীক্ষা করে দেখলাম sample_orig_month_1999এবং মনে হচ্ছে কাঁচা তথ্য ভালভাবে অর্ডার করেছে idএবং time। এটিই কি পারফরম্যান্স পার্থক্যের কারণ?

দেখে মনে হচ্ছে উইন্ডো ফাংশন পদ্ধতির তুলনায় জোড় পদ্ধতিতে আরও যৌক্তিক পাঠ রয়েছে, তবে পূর্বেরটির কার্যকর করার সময়টি আসলে কম is এটি কি কারণ পূর্ববর্তীটির আরও ভাল সমান্তরালতা আছে?

সংক্ষিপ্ত কোডের কারণে আমি উইন্ডো ফাংশন পদ্ধতিটি পছন্দ করি, এই নির্দিষ্ট সমস্যার জন্য এটির গতি বাড়ানোর কোনও উপায় আছে কি?

আমি উইন্ডোজ 10 64 বিটে এসকিউএল সার্ভার ব্যবহার করছি using

উত্তর:


11

স্ব সাথে যোগদানের তুলনায় অপেক্ষাকৃত কম সারি-মোড পারফরম্যান্স LEADএবং LAGউইন্ডো ফাংশনগুলি নতুন কিছু নয়। উদাহরণস্বরূপ, মাইকেল জিলবারস্টাইন এসকিউএলব্লগ.কম-এ 2012 সালে লিখেছিলেন the

পরিকল্পনা বিভাগ

এসকিউএল সার্ভার ২০১ 2016-এ, আপনার কাছে একটি নতুন বিকল্প রয়েছে, যা উইন্ডো সমষ্টিগুলির জন্য ব্যাচ মোড প্রসেসিং সক্ষম করে। এটি খালি থাকলেও এটিতে টেবিলে কিছু ধরণের কলামস্টোর সূচক প্রয়োজন। অপ্টিমাইজারের জন্য ব্যাচ মোড পরিকল্পনাগুলি বিবেচনা করার জন্য বর্তমানে একটি কলামস্টোর সূচকের উপস্থিতি প্রয়োজন। বিশেষত, এটি অনেক বেশি দক্ষ উইন্ডো সমষ্টিগত ব্যাচ-মোড অপারেটরকে সক্ষম করে।

আপনার ক্ষেত্রে এটি পরীক্ষা করতে, একটি খালি অবিবাহিত কলামস্টোর সূচক তৈরি করুন:

 -- Empty CS index
CREATE NONCLUSTERED COLUMNSTORE INDEX dummy 
ON dbo.tab1 (id, [time], [value]) 
WHERE id < 0 AND id > 0;

ক্যোয়ারী:

SELECT
    T1.id,
    T1.[time],
    T1.[value],
    value_lag = 
        LAG(T1.[value]) OVER (
            PARTITION BY T1.id
            ORDER BY T1.[time]),
    value_lead =
        LEAD(T1.[value]) OVER (
            PARTITION BY T1.id
            ORDER BY T1.[time])
FROM dbo.tab1 AS T1;

এখন যেমন একটি কার্যনির্বাহী পরিকল্পনা দেওয়া উচিত:

ব্যাচ মোড সারি স্টোর পরিকল্পনা

... যা খুব দ্রুত কার্যকর হতে পারে।

OPTION (MAXDOP 1)নতুন টেবিলে ফলাফলগুলি সংরক্ষণ করার সময় আপনার একই পরিকল্পনার আকার পেতে একটি বা অন্য ইঙ্গিত ব্যবহার করতে হবে । পরিকল্পনার সমান্তরাল সংস্করণে একটি ব্যাচ মোড সাজানোর প্রয়োজন (বা সম্ভবত দুটি), যা কিছুটা ধীর হতে পারে। এটি বরং আপনার হার্ডওয়ারের উপর নির্ভর করে।

ব্যাচ মোড উইন্ডো সমষ্টি অপারেটরের আরও তথ্যের জন্য ইতজিক বেন-গানের নিম্নলিখিত নিবন্ধগুলি দেখুন:

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