আমি উবুন্টু 12.04 এ পোস্টগ্রিজ এসকিউএল 9.1 ব্যবহার করি।
আমাকে অনেক সময়ের মধ্যে রেকর্ড নির্বাচন করতে হবে: আমার টেবিলে time_limits
দুটি timestamp
ক্ষেত্র এবং একটি integer
সম্পত্তি রয়েছে। আমার আসল টেবিলের অতিরিক্ত কলাম রয়েছে যা এই প্রশ্নের সাথে জড়িত নয়।
create table (
start_date_time timestamp,
end_date_time timestamp,
id_phi integer,
primary key(start_date_time, end_date_time,id_phi);
এই টেবিলটিতে মোটামুটি 2M রেকর্ড রয়েছে।
নিম্নলিখিতগুলির মতো প্রশ্নগুলি প্রচুর পরিমাণে সময় নিয়েছিল:
select * from time_limits as t
where t.id_phi=0
and t.start_date_time <= timestamp'2010-08-08 00:00:00'
and t.end_date_time >= timestamp'2010-08-08 00:05:00';
সুতরাং আমি অন্য সূচক যুক্ত করার চেষ্টা করেছি - পিকে বিপরীত:
create index idx_inversed on time_limits(id_phi, start_date_time, end_date_time);
পারফরম্যান্সের উন্নতি হয়েছে এমন ধারণাটি আমি পেয়েছি: টেবিলের মাঝখানে রেকর্ডগুলি অ্যাক্সেস করার সময়টি আরও যুক্তিসঙ্গত বলে মনে হচ্ছে: কোথাও 40 এবং 90 সেকেন্ডের মধ্যে।
তবে সময় সীমার মধ্যবর্তী মানের জন্য এটি এখনও কয়েক দশক সেকেন্ড। এবং টেবিলের শেষটিকে লক্ষ্য করে যখন আরও দ্বিগুণ হন (কালানুক্রমিকভাবে বলতে হয়)।
আমি explain analyze
এই ক্যোয়ারী পরিকল্পনাটি পাওয়ার জন্য প্রথমবার চেষ্টা করেছি :
Bitmap Heap Scan on time_limits (cost=4730.38..22465.32 rows=62682 width=36) (actual time=44.446..44.446 rows=0 loops=1)
Recheck Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
-> Bitmap Index Scan on idx_time_limits_phi_start_end (cost=0.00..4714.71 rows=62682 width=0) (actual time=44.437..44.437 rows=0 loops=1)
Index Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
Total runtime: 44.507 ms
অনুসন্ধানটি অনুকূল করতে আমি কী করতে পারি? আপনি একবারে id_phi
সেট হয়ে থাকা দুটি টাইমস্ট্যাম্প কলামগুলি স্ক্যান করতে সমস্ত সময় ব্যয় করতে পারেন 0
। এবং টাইমস্ট্যাম্পগুলিতে আমি বড় স্ক্যান (60 কে সারি!) বুঝতে পারি না। এগুলি কি প্রাথমিক কী দ্বারা সূচিযুক্ত নয় এবং idx_inversed
আমি যুক্ত করেছি?
আমার কি টাইমস্ট্যাম্পের ধরণ থেকে অন্য কিছুতে পরিবর্তন করা উচিত?
আমি জিআইএসটি এবং জিআইএন সূচী সম্পর্কে কিছুটা পড়েছি। আমি সংগ্রহ করি তারা কাস্টম ধরণের জন্য কিছু শর্তে আরও দক্ষ হতে পারে। এটি কি আমার ব্যবহারের ক্ষেত্রে ব্যবহারযোগ্য বিকল্প?
explain analyze
আউটপুটে রিপোর্ট করা সময়টি সার্ভারে কোয়েরির প্রয়োজনীয় সময় । যদি আপনার ক্যোয়ারীতে 45 সেকেন্ড সময় লাগে, তবে অতিরিক্ত সময় ব্যয় করা হয়েছে ডাটাবেস থেকে ডেটা স্থানান্তরিত প্রোগ্রামটিতে কোয়েরিটি চালানো সর্বোপরি এটি 62682 সারি এবং যদি প্রতিটি সারি বড় হয় (যেমন দীর্ঘ varchar
বা text
কলাম রয়েছে) তবে এটি স্থানান্তর সময়কে প্রভাবিত করতে পারে আয়তন বহুলাংশে।
rows=62682 rows
হ'ল পরিকল্পনাকারীর অনুমান । ক্যোয়ারী 0 টি সারি দেয়। (actual time=44.446..44.446 rows=0 loops=1)