ডেটা সহ কোনও সারণী পূরণ করার আগে, বা ডেটা স্থানে থাকার পরে সূচি তৈরি করা ভাল?


92

আমার প্রায় 100M সারিগুলির একটি টেবিল রয়েছে যা আমি পরিবর্তিত করে অনুলিপি করতে যাচ্ছি, একটি সূচক যুক্ত করে। আমি নতুন টেবিলটি তৈরি করতে যে সময় লাগে তার সাথে আমি এতটা উদ্বিগ্ন নই, তবে আমি যদি কোনও তথ্য সন্নিবেশ করার আগে টেবিলটি পরিবর্তন করি বা প্রথমে ডেটা sertোকাতে এবং তারপরে সূচকটি যুক্ত করি তবে কি তৈরি সূচকটি আরও কার্যকর হবে?

উত্তর:


117

ডেটা সন্নিবেশের পরে সূচী তৈরি করা আরও কার্যকর উপায় (এটি প্রায়শই ব্যাচ আমদানির আগে এবং আমদানির পরে এটি পুনরায় তৈরি করার আগে সূচক ছেড়ে দেওয়ার জন্য পুনরুদ্ধার করা হয়)।

সিন্টেটিক উদাহরণ (পোস্টগ্র্যাসকিউএল 9.1, ধীর বিকাশ মেশিন, এক মিলিয়ন সারি):

CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 7816.561 ms
CREATE INDEX test1_x ON test1 (x);
-- Time: 4183.614 ms

সন্নিবেশ করুন এবং তারপরে সূচি তৈরি করুন - প্রায় 12 সেকেন্ড

CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
-- Time: 2.315 ms
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 25399.460 ms

সূচী তৈরি করুন এবং তারপরে সন্নিবেশ করুন - প্রায় 25.5 সেকেন্ড (দ্বিগুণের বেশি ধীর)


4
+1, সূচিগুলি 100M সারি সন্নিবেশ করানো কার্যের সাথে জড়িত একটি ক্রিয়াকলাপ উল্লেখযোগ্যভাবে কমিয়ে দেবে, তাই এগুলি বাদ দিয়ে পুনরায় তৈরি করা ভাল।
কোড

11

সারি যুক্ত হওয়ার পরে সূচকটি তৈরি করা ভাল। এটি কেবল দ্রুত হবে না, তবে গাছের ভারসাম্য বোধ করা আরও ভাল।

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


2

এই সমস্যাটিতে এটি কোনও বিষয় নয় কারণ:

  1. আপনি যদি প্রথম টেবিলে ডেটা যুক্ত করেন এবং এর পরে আপনি সূচি যোগ করেন। আপনার সূচকের উত্পন্ন সময় O(n*log(N))দীর্ঘ হবে (যেখানে nএকটি সারি যুক্ত হবে)। কারণ গাছের আবর্তনের সময়টি O(N*log(N))যদি আপনি তখন এটি পুরানো ডেটা এবং নতুন ডেটাতে ভাগ করেন তবে এটি আপনাকে O((X+n)*log(N))সহজেই রূপান্তর করতে পারে O(X*log(N) + n*log(N))এবং এই ফর্ম্যাটে আপনি কেবল কীভাবে অতিরিক্ত অপেক্ষা করবেন তা দেখতে পাবেন।
  2. আপনি যদি সূচক যুক্ত করেন এবং এর পরে ডেটা রাখেন। প্রতিটি সারি (আপনার nনতুন সারি রয়েছে) আপনি O(log(N))এতে নতুন উপাদান যুক্ত করার পরে গাছের কাঠামোগুলি পুনরূদ্ধার করার জন্য অতিরিক্ত সময় সন্নিবেশ করান (নতুন সারি থেকে সূচক কলাম, কারণ সূচী ইতিমধ্যে বিদ্যমান এবং নতুন সারি যুক্ত করা হয়েছিল তখন সূচকটি ভারসাম্যতে পুনরায় জেনারেট করতে হবে) কাঠামো, এই ব্যয়টি O(log(P))যেখানে Pএকটি সূচক শক্তি [সূচকের উপাদানগুলি] । আপনার কাছে nনতুন সারি তারপর অবশেষে আপনি n * O(log(N))তারপর O(n*log(N))সারসংক্ষেপ অতিরিক্ত সময়।

1

এর পরে তৈরি সূচকগুলি বেশিরভাগ ক্ষেত্রে দ্রুত হয়। দৃষ্টিতে কেস: বর্ণের উপর পূর্ণ পাঠ্য সহ 20 মিলিয়ন সারি (255) - (ব্যবসায়ের নাম) সারণি আমদানি করা সত্ত্বেও - সবচেয়ে খারাপ ক্ষেত্রে 20 সেকেন্ড সময় নেওয়ার বিরুদ্ধে একটি ম্যাচ। ড্রপ সূচক এবং পুনর্নির্মাণ - প্রতিবার 1 সেকেন্ডেরও কম সময় নেওয়ার বিরুদ্ধে ম্যাচ


-2

আমি নিশ্চিত নই যে এটি সূচকের দক্ষতার জন্য সত্যই গুরুত্ব পাবে, যেহেতু উভয় ক্ষেত্রেই আপনি সূচকে নতুন ডেটা .োকাচ্ছেন। সার্ভারটি জানত না যে কোনও সূচকটি মূলত তৈরি হওয়ার পরে পর্যন্ত কতটা ভারসাম্যহীন হবে। স্পিড ওয়াইস, স্পষ্টতই, সূচি ছাড়াই সন্নিবেশগুলি করুন।

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