এটি @ আলেকসান্ডার ফেডোরেনকো জবাবের একটি পরিবর্তিত সংস্করণ যেখানে একটি বিধি যুক্ত করেছে:
UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
FROM DESTINATAIRE_TEMP
) x
WHERE x.CODE_DEST <> x.New_CODE_DEST AND x.CODE_DEST IS NOT NULL
WHERE ক্লজটি যুক্ত করে আমি পরবর্তী আপডেটগুলির জন্য কর্মক্ষমতা ব্যাপকভাবে উন্নত দেখতে পেয়েছি। এসকিএল সার্ভার মনে করে সারিটি আপডেট করার পরেও মানটি ইতিমধ্যে উপস্থিত রয়েছে এবং এটি করতে সময় লাগে, সুতরাং যেখানে ক্লজ যুক্ত করা এটি সারিগুলিতে সরে যায় যেখানে মানটি পরিবর্তন হয়নি। আমাকে বলতে হবে যে এটি আমার ক্যোয়ারীটি কীভাবে চালাতে পারে তা সম্পর্কে আমি অবাক হয়েছি।
দাবি অস্বীকার: আমি কোনও ডিবি বিশেষজ্ঞ নই, এবং আমি আমার অনুচ্ছেদের জন্য পার্টিশন বাই ব্যবহার করছি যাতে এই প্রশ্নের জন্য ঠিক একই ফলাফল না হয়। আমার জন্য প্রশ্নের মধ্যে থাকা কলামটি কোনও গ্রাহকের প্রদত্ত অর্ডার, সুতরাং সেটটি সেট হয়ে যাওয়ার পরে মানটি সাধারণত পরিবর্তিত হয় না।
আপনার সূচী রয়েছে তাও নিশ্চিত করুন, বিশেষত নির্বাচনী বিবৃতিতে আপনার কাছে একটি শুল্ক রয়েছে। ফিল্টারিং সূচকটি আমার জন্য দুর্দান্ত কাজ করেছে কারণ আমি পেমেন্টের স্থিতির উপর ভিত্তি করে ফিল্টারিং করছি।
দ্বারা আমার পার্টিশন ব্যবহার করে জিজ্ঞাসা
UPDATE UpdateTarget
SET PaidOrderIndex = New_PaidOrderIndex
FROM
(
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
) AS UpdateTarget
WHERE UpdateTarget.PaidOrderIndex <> UpdateTarget.New_PaidOrderIndex AND UpdateTarget.PaidOrderIndex IS NOT NULL
-- test to 'break' some of the rows, and then run the UPDATE again
update [order] set PaidOrderIndex = 2 where PaidOrderIndex=3
'কুল নল নয়' অংশটির প্রয়োজন নেই যদি কলামটি শোধনযোগ্য নয়।
যখন আমি বলি যে পারফরম্যান্স বৃদ্ধি প্রচুর পরিমাণে হয়েছিল তখন আমি বোঝাতে চাইছি যে অল্প সংখ্যক সারি আপডেট করার সময় এটি মূলত তাত্ক্ষণিক ছিল। ডান সূচীগুলির সাহায্যে আমি একটি আপডেট অর্জন করতে সক্ষম হয়েছি যা একইসাথে 'অভ্যন্তরীণ' ক্যোয়ারী হিসাবে সময় নেয়:
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID