কল্পনা করুন যে আপনার নীচের সারণির কাঠামো রয়েছে:
LogId | ProductId | FromPositionId | ToPositionId | Date | Quantity
-----------------------------------------------------------------------------------
1 | 123 | 0 | 10002 | 2018-01-01 08:10:22 | 5
2 | 123 | 0 | 10003 | 2018-01-03 15:15:10 | 9
3 | 123 | 10002 | 10004 | 2018-01-07 21:08:56 | 3
4 | 123 | 10004 | 0 | 2018-02-09 10:03:23 | 1
FromPositionId
এবং ToPositionId
স্টক পজিশন হয়। কিছু অবস্থানের আইডি: এর বিশেষ অর্থ রয়েছে, উদাহরণস্বরূপ 0
। বা এর থেকে একটি ইভেন্টের 0
অর্থ হ'ল স্টকটি তৈরি বা সরানো হয়েছিল। থেকে 0
এবং একটি ডেলিভারি থেকে স্টক হতে পারে জন্য 0
একটি জাহাজে অর্ডার হতে পারে।
এই সারণীতে বর্তমানে প্রায় 5.5 মিলিয়ন সারি রয়েছে। আমরা এই জাতীয় কিছু দেখতে এমন কোয়েরি ব্যবহার করে একটি তফসিলের জন্য প্রতিটি পণ্য এবং অবস্থানের জন্য ক্যাশে টেবিলের জন্য স্টক মান গণনা করি:
WITH t AS
(
SELECT ToPositionId AS PositionId, SUM(Quantity) AS Quantity, ProductId
FROM ProductPositionLog
GROUP BY ToPositionId, ProductId
UNION
SELECT FromPositionId AS PositionId, -SUM(Quantity) AS Quantity, ProductId
FROM ProductPositionLog
GROUP BY FromPositionId, ProductId
)
SELECT t.ProductId, t.PositionId, SUM(t.Quantity) AS Quantity
FROM t
WHERE NOT t.PositionId = 0
GROUP BY t.ProductId, t.PositionId
HAVING SUM(t.Quantity) > 0
যদিও এটি একটি যুক্তিসঙ্গত পরিমাণে প্রায় (প্রায় 20 সেকেন্ড) মধ্যে পূর্ণ হয়, আমি মনে করি এটি স্টক মানগুলি গণনা করার জন্য বেশ অদক্ষ উপায়। INSERT
এই টেবিলে আমরা খুব কমই কিছু করতে পারি : তবে কখনও কখনও আমরা এই সারিগুলি তৈরি করে লোকজনের ভুলের কারণে আমরা ভিতরে andুকে পরিমাণটি সামঞ্জস্য করি বা একটি সারি ম্যানুয়ালি সরিয়ে ফেলি।
আমার একটি পৃথক সারণীতে "চেকপয়েন্ট" তৈরি করার ধারণা ছিল, সময় নির্দিষ্ট সময় পর্যন্ত মান গণনা করা এবং আমাদের স্টক পরিমাণের ক্যাশে টেবিল তৈরি করার সময় এটি একটি শুরুর মান হিসাবে ব্যবহার:
ProductId | PositionId | Date | Quantity
-------------------------------------------------------
123 | 10002 | 2018-01-07 21:08:56 | 2
আমরা মাঝে মাঝে সারিগুলি পরিবর্তন করি তা এই সমস্যার কারণ হয়ে দাঁড়ায়, সেই ক্ষেত্রে আমাদের অবশ্যই লগ সারি পরিবর্তিত হওয়ার পরে তৈরি হওয়া কোনও চৌকোপোটি সরাতে হবে। এখন অবধি চেকপয়েন্টগুলি গণনা না করে এটি সমাধান করা যেতে পারে তবে এখন থেকে শেষ চৌকপয়েন্টের মধ্যে এক মাস রেখে দিন (আমরা খুব কমই খুব সহজেই এর পরিবর্তন করেছি)।
আমাদের মাঝে মাঝে সারিগুলি পরিবর্তন করা দরকার তা এড়ানো শক্ত এবং আমি এখনও এটি করতে সক্ষম হতে চাই, এটি এই কাঠামোতে দেখানো হয়নি তবে লগ ইভেন্টগুলি কখনও কখনও অন্যান্য সারণীতে অন্য রেকর্ডের সাথে আবদ্ধ থাকে এবং অন্য লগ সারি যুক্ত করে থাকে সঠিক পরিমাণ পেতে কখনও কখনও সম্ভব হয় না।
লগ টেবিলটি হ'ল, আপনি কল্পনা করতে পারেন, বেশ দ্রুত বাড়ছে এবং গণনার সময় কেবল সময়ের সাথে বাড়বে।
সুতরাং আমার প্রশ্ন, আপনি কিভাবে এই সমাধান করবে? বর্তমান স্টক মান গণনার আরও কার্যকর উপায় আছে কি? চেকপয়েন্টগুলি সম্পর্কে আমার ধারণাটি কি ভাল?
আমরা এসকিউএল সার্ভার 2014 ওয়েব চালিয়ে যাচ্ছি (12.0.5511)
সম্পাদন পরিকল্পনা: https://www.brentozar.com/pastetheplan/?id=Bk8gyc68Q
আমি আসলে উপরেরটিকে ভুল প্রয়োগের সময় দিয়েছিলাম, 20-এর দশকে ক্যাশের সম্পূর্ণ আপডেটের সময় ছিল। এই কোয়েরিটি চালাতে কোথাও প্রায় 6-10 সেকেন্ড সময় নেয় (যখন আমি এই কোয়েরি পরিকল্পনাটি তৈরি করেছি 8 সেকেন্ড) এই প্রশ্নের মধ্যে একটি যোগদানও রয়েছে যা মূল প্রশ্নে ছিল না।