আমি একটি আপডেট করছি যেখানে আমার একটি tstzrange
ভেরিয়েবলের সাথে সঠিক সাম্য প্রয়োজন । M 1 এম সারিগুলি সংশোধন করা হয়েছে, এবং ক্যোয়ারীতে 13 মিনিট সময় লাগে। ফলাফল এখানেEXPLAIN ANALYZE
দেখা যায় , এবং প্রকৃত ফলাফল ক্যোয়ার পরিকল্পনাকারী দ্বারা অনুমান করা থেকে পৃথক। সমস্যাটি হ'ল সূচক স্ক্যানটি প্রত্যাশা করে যে কোনও একক সারি ফিরে আসবে।t_range
এটি এই সত্যের সাথে সম্পর্কিত বলে মনে হয় যে পরিসরের ধরণের পরিসংখ্যানগুলি অন্য ধরণের তুলনায় আলাদাভাবে সংরক্ষণ করা হয়। এ খুঁজছি pg_stats
কলামের জন্য দেখুন, n_distinct
-1 এবং অন্যান্য ক্ষেত্র (যেমন most_common_vals
, most_common_freqs
) খালি আছে।
তবে t_range
কোথাও অবশ্যই পরিসংখ্যান থাকতে হবে । একটি যথাযথ সমতুল্য আপডেট যেখানে আমি সঠিক_একটি সামঞ্জস্যের পরিবর্তে 'অভ্যন্তরীণ' ব্যবহার করি তা সম্পাদন করতে প্রায় 4 মিনিট সময় লাগে, এবং যথেষ্ট আলাদা ক্যোয়ারী প্ল্যান ব্যবহার করে ( এখানে দেখুন )। দ্বিতীয় ক্যোয়ারী পরিকল্পনাটি আমার কাছে বোধগম্য কারণ টেম্প টেবিলের প্রতিটি সারি এবং ইতিহাস সারণির একটি উল্লেখযোগ্য ভগ্নাংশ ব্যবহৃত হবে। আরও গুরুত্বপূর্ণ বিষয় হল, ক্যোয়ারী পরিকল্পনাকারী ফিল্টারটি চালু করার জন্য সারিগুলির প্রায় সঠিক সংখ্যার পূর্বাভাস দেয় t_range
।
এর বিতরণ t_range
কিছুটা অস্বাভাবিক। আমি অন্য টেবিলের tableতিহাসিক অবস্থা সংরক্ষণ করতে এই টেবিলটি ব্যবহার করছি এবং অন্য টেবিলের পরিবর্তনগুলি একবারে বড় আকারের ডাম্পগুলিতে ঘটে, তাই এর আলাদা আলাদা মানগুলি হয় না t_range
। এখানে প্রতিটি অনন্য মানের সাথে সম্পর্কিত গণনা রয়েছে t_range
:
t_range | count
-------------------------------------------------------------------+---------
["2014-06-12 20:58:21.447478+00","2014-06-27 07:00:00+00") | 994676
["2014-06-12 20:58:21.447478+00","2014-08-01 01:22:14.621887+00") | 36791
["2014-06-27 07:00:00+00","2014-08-01 07:00:01+00") | 1000403
["2014-06-27 07:00:00+00",infinity) | 36791
["2014-08-01 07:00:01+00",infinity) | 999753
t_range
উপরের স্বতন্ত্র গণনাগুলি সম্পূর্ণ, সুতরাং কার্ডিনালটি M 3 এম (যার মধ্যে update 1M আপডেটের কোয়েরিতে প্রভাবিত হবে)।
ক্যোয়ারী 1 কেন 2 এর চেয়ে বেশি খারাপভাবে সম্পাদন করে? আমার ক্ষেত্রে, ক্যোয়ারি 2 একটি ভাল বিকল্প, তবে যদি সত্যিকারের সীমার সাম্যতা প্রয়োজন হয় তবে আমি কীভাবে পোস্টগ্রেসকে আরও চৌকস ক্যোয়ারী প্ল্যান ব্যবহার করতে পারি?
সূচিপত্র সহ সারণির সংজ্ঞা (অপ্রাসঙ্গিক কলামগুলি বাদ দেওয়া):
Column | Type | Modifiers
---------------------+-----------+------------------------------------------------------------------------------
history_id | integer | not null default nextval('gtfs_stop_times_history_history_id_seq'::regclass)
t_range | tstzrange | not null
trip_id | text | not null
stop_sequence | integer | not null
shape_dist_traveled | real |
Indexes:
"gtfs_stop_times_history_pkey" PRIMARY KEY, btree (history_id)
"gtfs_stop_times_history_t_range" gist (t_range)
"gtfs_stop_times_history_trip_id" btree (trip_id)
প্রশ্ন 1:
UPDATE gtfs_stop_times_history sth
SET shape_dist_traveled = tt.shape_dist_traveled
FROM gtfs_stop_times_temp tt
WHERE sth.trip_id = tt.trip_id
AND sth.stop_sequence = tt.stop_sequence
AND sth.t_range = '["2014-08-01 07:00:01+00",infinity)'::tstzrange;
প্রশ্ন 2:
UPDATE gtfs_stop_times_history sth
SET shape_dist_traveled = tt.shape_dist_traveled
FROM gtfs_stop_times_temp tt
WHERE sth.trip_id = tt.trip_id
AND sth.stop_sequence = tt.stop_sequence
AND '2014-08-01 07:00:01+00'::timestamptz <@ sth.t_range;
কিউ 1 আপডেট 999753 সারি এবং কিউ 2 আপডেট 999753 + 36791 = 1036544 (অর্থাত টেম্প টেবিলটি এমন যে সময় সীমা শর্তের সাথে মিলিয়ে প্রতিটি সারি আপডেট করা হয়)।
@ ইয়পারক्यूबের মন্তব্যের জবাবে আমি এই প্রশ্নের চেষ্টা করেছি :
প্রশ্ন 3:
UPDATE gtfs_stop_times_history sth
SET shape_dist_traveled = tt.shape_dist_traveled
FROM gtfs_stop_times_temp tt
WHERE sth.trip_id = tt.trip_id
AND sth.stop_sequence = tt.stop_sequence
AND sth.t_range <@ '["2014-08-01 07:00:01+00",infinity)'::tstzrange
AND '["2014-08-01 07:00:01+00",infinity)'::tstzrange <@ sth.t_range;
ক্যোয়ারী পরিকল্পনা এবং ফলাফলগুলি ( এখানে দেখুন ) পূর্ববর্তী দুটি ক্ষেত্রে (~ 6 মিনিট) মধ্যবর্তী ছিল।
2016/02/05 সম্পাদনা
1.5 বছর পরে ডেটাতে আর অ্যাক্সেস নেই, আমি একই কাঠামো (কোনও সূচক ছাড়াই) এবং অনুরূপ কার্ডিনালিটি সহ একটি টেস্ট টেবিল তৈরি করেছি। জাজানসের উত্তর প্রস্তাব করেছিল যে কারণটি আপডেটের জন্য ব্যবহৃত অস্থায়ী টেবিলের ক্রম হতে পারে। আমি সরাসরি হাইপোথিসিসটি পরীক্ষা করতে পারিনি কারণ আমার track_io_timing
(অ্যামাজন আরডিএস ব্যবহার করে) অ্যাক্সেস নেই ।
সামগ্রিক ফলাফলগুলি বেশ দ্রুত ছিল (বেশ কয়েকটিটির ফ্যাক্টর দ্বারা)। আমি অনুমান করছি যে এরভিনের উত্তরের সাথে সামঞ্জস্য রেখে সূচকগুলি অপসারণের কারণেই এটি ঘটেছে ।
এই পরীক্ষার ক্ষেত্রে, ক্যুরিস 1 এবং 2 মূলত একই পরিমাণ সময় নিয়েছিল, কারণ তারা উভয়ই একত্রীকরণ সংযুক্তি ব্যবহার করেছিল। এটি হ'ল পোস্টগ্র্রেস হ্যাশ যোগদানের জন্য যা কিছু সৃষ্টি করছিল তাতে আমি ট্রিগার করতে অক্ষম ছিলাম, সুতরাং পোস্টগ্রাস কেন প্রথম স্থানে দুর্বল-সম্পাদনকারী হ্যাশ যোগ বেছে নিচ্ছেন সে সম্পর্কে আমার কোনও স্পষ্টতা নেই।
(lower(t_range),upper(t_range))
যেহেতু আপনি সাম্যটি পরীক্ষা করেন।
(a = b)
দুই "রয়েছে" শর্তাবলী:(a @> b AND b @> a)
? পরিকল্পনা কি পরিবর্তন হয়?