1.5M সারি সহ একটি টেবিলে আমার তুলনামূলকভাবে সহজ প্রশ্ন রয়েছে:
SELECT mtid FROM publication
WHERE mtid IN (9762715) OR last_modifier=21321
LIMIT 5000;
EXPLAIN ANALYZE
আউটপুট:
Limit (cost=8.84..12.86 rows=1 width=8) (actual time=0.985..0.986 rows=1 loops=1) -> Bitmap Heap Scan on publication (cost=8.84..12.86 rows=1 width=8) (actual time=0.984..0.985 rows=1 loops=1) Recheck Cond: ((mtid = 9762715) OR (last_modifier = 21321)) -> BitmapOr (cost=8.84..8.84 rows=1 width=0) (actual time=0.971..0.971 rows=0 loops=1) -> Bitmap Index Scan on publication_pkey (cost=0.00..4.42 rows=1 width=0) (actual time=0.295..0.295 rows=1 loops=1) Index Cond: (mtid = 9762715) -> Bitmap Index Scan on publication_last_modifier_btree (cost=0.00..4.42 rows=1 width=0) (actual time=0.674..0.674 rows=0 loops=1) Index Cond: (last_modifier = 21321) Total runtime: 1.027 ms
এখন পর্যন্ত এত ভাল, দ্রুত এবং উপলব্ধ সূচকগুলি ব্যবহার করে।
এখন, যদি আমি একটি ক্যোয়ারিকে কিছুটা সংশোধন করি তবে ফলাফলটি হবে:
SELECT mtid FROM publication
WHERE mtid IN (SELECT 9762715) OR last_modifier=21321
LIMIT 5000;
EXPLAIN ANALYZE
আউটপুট হল:
Limit (cost=0.01..2347.74 rows=5000 width=8) (actual time=2735.891..2841.398 rows=1 loops=1) -> Seq Scan on publication (cost=0.01..349652.84 rows=744661 width=8) (actual time=2735.888..2841.393 rows=1 loops=1) Filter: ((hashed SubPlan 1) OR (last_modifier = 21321)) SubPlan 1 -> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1) Total runtime: 2841.442 ms
এত দ্রুত নয়, এবং সিক স্ক্যান ব্যবহার করা হচ্ছে ...
অবশ্যই, অ্যাপ্লিকেশন দ্বারা চালিত মূল ক্যোয়ারীটি কিছুটা জটিল এবং আরও ধীর এবং অবশ্যই হাইবারনেট-উত্পাদিত আসলটি নয় (SELECT 9762715)
, তবে এর জন্যও অস্তিত্ব রয়েছে (SELECT 9762715)
! ক্যোয়ারী হাইবারনেট দ্বারা উত্পাদিত হয়েছে, সুতরাং এগুলি পরিবর্তন করা বেশ চ্যালেঞ্জ, এবং কিছু বৈশিষ্ট্য উপলব্ধ নেই (যেমন UNION
উপলব্ধ নয়, যা দ্রুত হবে)।
প্রশ্নসমুহ
- দ্বিতীয় ক্ষেত্রে সূচকটি কেন ব্যবহার করা যাবে না? তারা কিভাবে ব্যবহার করা যেতে পারে?
- আমি কি অন্যভাবে কোয়েরি পারফরম্যান্স উন্নত করতে পারি?
অতিরিক্ত চিন্তা
দেখে মনে হচ্ছে আমরা প্রথম কেসটি ম্যানুয়ালি একটি নির্বাচন করে, এবং তারপরে ফলাফলের তালিকাটি কোয়েরিতে রেখেছি। এমনকি IN () তালিকায় 5000 নম্বরের সাথে এটি দ্বিতীয় সমাধানের চেয়ে চারগুণ দ্রুত। তবে, এটি কেবল ভুল বলে মনে হচ্ছে (এছাড়াও এটি 100 গুণ দ্রুত হতে পারে :))। কেন এই ক্যোয়ারি পরিকল্পনাকারী এই দুটি প্রশ্নের জন্য সম্পূর্ণ ভিন্ন পদ্ধতি ব্যবহার করেন এটি সম্পূর্ণই বোধগম্য, সুতরাং আমি এই সমস্যার একটি ভাল সমাধান খুঁজে পেতে চাই।
(SELECT 9762715)
।
(SELECT 9762715)
। হাইবারনেট প্রশ্নের কাছে: এটি করা যেতে পারে তবে আমাদের মারাত্মক কোড পুনর্লিখনের প্রয়োজন রয়েছে, কারণ আমাদের কাছে ব্যবহারকারী-সংজ্ঞায়িত হাইবারনেট মানদণ্ড রয়েছে যা অন-ফ্লাইয়ে অনুবাদ করা হয়। সুতরাং মূলত আমরা হাইবারনেটটি সংশোধন করব যা সম্ভাব্য পার্শ্ব প্রতিক্রিয়াগুলির সাথে একটি বিশাল উদ্যোগ।
JOIN
পরিবর্তে একটি উত্পন্ন করেIN ()
? এছাড়াও,publication
সম্প্রতি বিশ্লেষণ করা হয়েছে?