আমি COUNT(*)150,000 সারি সহ একটি টেবিলে চেষ্টা করছি যাতে একটি প্রাথমিক কী আছে। এটি প্রায় 5 মিনিটের সরঞ্জাম, তাই আমি বুঝতে পেরেছি এটি একটি সূচক সমস্যা।
পোস্টগ্র্যাস এসকিউএল ম্যানুয়ালটির উদ্ধৃতি :
REINDEX সূচকটির ড্রপ এবং পুনরায় তৈরি করার অনুরূপ যে সূচিটি সূচি থেকে পুনরায় তৈরি করা হয়। তবে লক করার বিবেচনাগুলি ভিন্ন। REINDEX লেখার তালা আউট করে তবে সূচকের মূল টেবিলে পড়ে না। এটি নির্দিষ্ট সূচককে প্রক্রিয়াজাতকরণের ক্ষেত্রে একচেটিয়া লকও নিয়ে যায়, যা সেই সূচকটি ব্যবহার করার প্রয়াসকে অবরুদ্ধ করবে (...) পরবর্তী ক্রিয়েট সূচকটি লক আউট করে লেখায় তবে পড়ে না; যেহেতু সূচকটি নেই, কোনও পঠনই এটি ব্যবহার করার চেষ্টা করবে না, এর অর্থ হ'ল কোনও ব্লক হবে না তবে পাঠকদের ব্যয়বহুল অনুক্রমিক স্ক্যানগুলিতে বাধ্য করা যেতে পারে।
আপনার নিজের অভিজ্ঞতা থেকে, আপনি বলতে পারেন:
- হয়
REINDEXINGবিপজ্জনক? এটি কি ডেটা ধারাবাহিকতার ক্ষতি করতে পারে? - এটি কি অনেক সময় নিতে পারে?
- এটি কি আমার দৃশ্যের সম্ভাব্য সমাধান?
হালনাগাদ:
আমাদের জন্য যে সমাধানটি কাজ করেছিল তা হ'ল একই সূচকটি আলাদা নামের সাথে পুনরায় তৈরি করা হয়েছিল, তারপরে পুরানো সূচি মুছে ফেলা হয়েছিল।
সূচকের তৈরিটি খুব দ্রুত এবং আমরা সূচকের আকার 650 এমবি থেকে 8 এমবি করে কমিয়েছি। এর COUNT(*)সাথে একটি ব্যবহার করতে betweenসময় লাগে মাত্র 3 সেকেন্ড।
COUNT(*)সেরা পছন্দ:If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.