REINDEX বিপজ্জনক?


17

আমি COUNT(*)150,000 সারি সহ একটি টেবিলে চেষ্টা করছি যাতে একটি প্রাথমিক কী আছে। এটি প্রায় 5 মিনিটের সরঞ্জাম, তাই আমি বুঝতে পেরেছি এটি একটি সূচক সমস্যা।

পোস্টগ্র্যাস এসকিউএল ম্যানুয়ালটির উদ্ধৃতি :

REINDEX সূচকটির ড্রপ এবং পুনরায় তৈরি করার অনুরূপ যে সূচিটি সূচি থেকে পুনরায় তৈরি করা হয়। তবে লক করার বিবেচনাগুলি ভিন্ন। REINDEX লেখার তালা আউট করে তবে সূচকের মূল টেবিলে পড়ে না। এটি নির্দিষ্ট সূচককে প্রক্রিয়াজাতকরণের ক্ষেত্রে একচেটিয়া লকও নিয়ে যায়, যা সেই সূচকটি ব্যবহার করার প্রয়াসকে অবরুদ্ধ করবে (...) পরবর্তী ক্রিয়েট সূচকটি লক আউট করে লেখায় তবে পড়ে না; যেহেতু সূচকটি নেই, কোনও পঠনই এটি ব্যবহার করার চেষ্টা করবে না, এর অর্থ হ'ল কোনও ব্লক হবে না তবে পাঠকদের ব্যয়বহুল অনুক্রমিক স্ক্যানগুলিতে বাধ্য করা যেতে পারে।

আপনার নিজের অভিজ্ঞতা থেকে, আপনি বলতে পারেন:

  • হয় REINDEXINGবিপজ্জনক? এটি কি ডেটা ধারাবাহিকতার ক্ষতি করতে পারে?
  • এটি কি অনেক সময় নিতে পারে?
  • এটি কি আমার দৃশ্যের সম্ভাব্য সমাধান?

হালনাগাদ:

আমাদের জন্য যে সমাধানটি কাজ করেছিল তা হ'ল একই সূচকটি আলাদা নামের সাথে পুনরায় তৈরি করা হয়েছিল, তারপরে পুরানো সূচি মুছে ফেলা হয়েছিল।

সূচকের তৈরিটি খুব দ্রুত এবং আমরা সূচকের আকার 650 এমবি থেকে 8 এমবি করে কমিয়েছি। এর COUNT(*)সাথে একটি ব্যবহার করতে betweenসময় লাগে মাত্র 3 সেকেন্ড।

উত্তর:


15

রিইন্ডেক্সিং বিপজ্জনক নয় এবং ডেটা সামঞ্জস্যকে ক্ষতি করতে পারে না। তবে আপনার সমালোচনামূলক লেখার সময় থাকলে, টেবিলটি লক হয়ে থাকলে এবং ডিএমএলটি বাতিল করা হলে আপনি ডেটা আলগা করতে পারেন।

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

এটি সম্ভাব্য নয় এটি একটি সূচক সমস্যা। COUNT(*)কোনও সূচী না পড়ার ক্ষেত্রে কোনও টেবিল স্ক্যান ব্যবহার করা উচিত। আমি আশা করি আপনার কোনও ধরণের আইও সমস্যা আছে।

ব্যবহার করার চেষ্টা করুন COUNT(1)বা COUNT(pk_field)যা সূচকটি ব্যবহার করতে পারে।

আপনি যদি ইউনিক্স বা লিনাক্স প্ল্যাটফর্মে চলমান থাকেন তবে আপনি ডিস্কের ক্রিয়াকলাপটি পর্যবেক্ষণ করতে চাইতে পারেন sar। আপনার একটি ব্যর্থ ডিস্কও থাকতে পারে যা আইও হারকে নাটকীয়ভাবে হ্রাস করতে পারে।

বৃহত অবজেক্ট সহ টেবিলগুলি COUNT (*) এর জন্য রেকর্ডগুলি তৈরি করতে IO উল্লেখযোগ্যভাবে বাড়িয়ে তুলতে পারে।


2
Wiki.postgresql.org এর মতে, 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.
কমলা 80

1

আমি আপনার পক্ষে সেরা উত্তর সম্পর্কে নিশ্চিত নই। তবে এই থ্রেডটি কিছু ভাল পরামর্শ দেয় বলে মনে হচ্ছে: এন http://postgresql.1045698.n5.nabble.com/count-performance-issue-td2067873.html

একটি দ্রষ্টব্য হ'ল আপনি আলাদা টেবিলে সারি গণনা বজায় রাখতে একটি ট্রিগার প্রয়োগ করতে পারেন (যদি COUNT (*) আপনার অ্যাপ্লিকেশন দ্বারা প্রায়শই ডাকা হবে)।

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

অন্য একটি পরামর্শ মত দেখাচ্ছে:

ANALYZE tablename;
SELECT reltuple FROM pg_class WHERE relname = 'tablename';

এবং কেউ এ। ক্রেটস্মার নোট হিসাবে চিহ্নিত:

না। বর্তমান সূচক-বাস্তবায়নে বর্তমান লেনদেনের মধ্যে সারি-দৃশ্যমানতা সম্পর্কে কোনও তথ্য নেই। বর্তমান সারিটি বর্তমান লেনদেনের মধ্যে দৃশ্যমান কিনা তা পেতে আপনাকে পুরো ডেটা-টেবিলটি স্ক্যান করতে হবে।

... পারফরম্যান্স উদ্বেগ হিসাবে সারি স্তরের অনুমতি সম্পর্কে আমার মন্তব্য সমর্থন।

আমার অনুসন্ধানটি উইকিভিএস: মাইএসকিউএল বনাম পোস্টগ্রেএসকিউএল: COUNT (*) চালু করেছে

গুগল: পোস্টগ্র্যাস্কল গণনা (*) পারফরম্যান্স ব্যবহার করে আমি যে অন্যান্য ফলাফল পেয়েছি তা বুঝতে পেরেছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.