পোস্টগ্রিসে সমবর্তী আপডেটগুলি অনুকূল করা


9

আমি এই জাতীয় যুগ্ম পোস্টগ্রিজ কোয়েরি চালাচ্ছি:

UPDATE foo SET bar = bar + 1 WHERE baz = 1234

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

ডেডলকগুলিতে দুর্বল না হয়ে কর্মক্ষমতা উন্নত করার কোনও উপায় আছে কি? আমি সন্দেহ করি যে (baz)সূচকটির সাথে সূচকটি প্রতিস্থাপন করা (baz, id)কাজ করতে পারে যে পোস্টগ্র্রেস একইভাবে সারিগুলি যেভাবে এটি স্ক্যান করেছে সেগুলি আপডেট করে, এটি কি অনুসরণ করার মতো উপায়?


আমি আপনাকে CREATE TABLEকোড যুক্ত করার পরামর্শ দিচ্ছি ।
ypercubeᵀᴹ

উত্তর:


15

সেখানে নেই ORDER BYএকটি ইন SQL UPDATEকমান্ড। সালিসত ক্রমে আপডেট সারি পোস্টগ্র্যাগ করে:

নিরঙ্কুশ নিশ্চয়তার সাথে অচলাবস্থা এড়াতে, আপনি আপনার স্টেটমেন্টগুলি সিরিয়ালাইজযোগ্য লেনদেনের বিচ্ছিন্নতায় চালাতে পারেন । তবে এটি আরও ব্যয়বহুল এবং সিরিয়ালাইজেশন ব্যর্থতার বিষয়ে আদেশগুলি পুনরাবৃত্তি করতে আপনাকে প্রস্তুত করতে হবে।

আপনার সর্বোত্তম ক্রিয়াটি সম্ভবত সম্ভবত SELECT ... ORDER BY ... FOR UPDATEসাবকোয়ারিতে বা SELECTলেনদেনের ক্ষেত্রে স্বতন্ত্রভাবে লক করা - ডিফল্ট "পড়া প্রতিশ্রুতিবদ্ধ" বিচ্ছিন্নতার স্তরে। Pgsql- সাধারণের উপর টম লেনের উদ্ধৃতি :

ঠিকঠাক হওয়া উচিত --- আপডেট আপডেট লক করা সর্বদা নির্বাচন পাইপলাইনের সর্বশেষ পদক্ষেপ।

এটি কাজ করা উচিত:

BEGIN;

SELECT 1
FROM   foo 
WHERE  baz = 1234
ORDER  BY bar
FOR    UPDATE;

UPDATE foo
SET    bar = bar + 1
WHERE  baz = 1234;

COMMIT;

একটি মাল্টিকালম সূচকটি (baz, bar)পারফরম্যান্সের জন্য উপযুক্ত be তবে যেহেতু barস্পষ্টতই অনেকগুলি আপডেট করা হয়েছে , কেবলমাত্র একটি একক-কলাম সূচকটি (baz)আরও ভাল হতে পারে। কয়েকটি কারণের উপর নির্ভর করে। প্রতি সারি কত baz? হয় গরম আপডেট সম্ভব multicolumn সূচক ছাড়া? ...

যদি baz একই সাথে আপডেট করা হয় তবে এখনও দ্বন্দ্বের জন্য সম্ভাব্য কোণার সম্ভাবনা রয়েছে (প্রতি ডকুমেন্টেশন) :

লেনদেনের বিচ্ছিন্নতা স্তরে SELECTচলছে এমন একটি কমান্ড এবং লকিং ক্লজটি সারি সারি সরিয়ে ফেলার জন্য এটি সম্ভব। ...READ COMMITTEDORDER BY

এছাড়াও, যদি আপনার জড়িত একটি অনন্য বাধা থাকা উচিত bar, একই কমান্ডের মধ্যে অনন্য লঙ্ঘন এড়াতে একটি DEFERRABLEসীমাবদ্ধতা বিবেচনা করুন । সম্পর্কিত উত্তর:


1
যদি আমি এর idপরিবর্তে বা অন্য কোনও অনন্য কলামটি অর্ডার করছি barতবে কোনও কর্নার কেস বা পারফরম্যান্স হিট হওয়া উচিত নয়, তাই না?
অ্যালেক্সি আভেরচেঙ্কো

@ আলেক্সিআভারচেঙ্কো: হ্যাঁ, একটি অনন্য কলাম যা কখনও আপডেট হয় না তা এই জন্য উপযুক্ত হবে - এবং এই কলামটি দ্বিতীয় অবস্থানে অন্তর্ভুক্ত করে একটি বহুবিধ সূচক।
এরউইন ব্র্যান্ডসটেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.