CHAR (36) থেকে ইউইউডিতে কলামের ধরণটি পরিবর্তন করার জন্য আমার কি সময় বিনিয়োগ করা উচিত?


14

আমার ডাটাবেসে ইতিমধ্যে কয়েক মিলিয়ন সারি রয়েছে। আমি যখন আমার স্কিমা ডিজাইন করেছিলাম তখন পোস্টগ্রিসএসকিউএল ইউআইডি ডেটা টাইপ সম্পর্কে জানতাম না।

এক টেবিলের মধ্যে 16 এম সারি রয়েছে (শার্ড প্রতি প্রায় 3.5M থেকে 4 এম রেকর্ড), প্রতিদিন প্রায় 500K রেকর্ডে বাড়ছে। প্রয়োজন পড়লে কয়েক ঘন্টা প্রোডাকশন ব্যবস্থা নামিয়ে নেওয়ার বিলাসিতা আমার কাছে রয়েছে। এক বা দুই সপ্তাহের মধ্যে আমার এই বিলাসিতা হবে না।

আমার প্রশ্ন, এটা কি সার্থক হবে? আমি JOIN এর পারফরম্যান্স, ডিস্ক স্পেস ব্যবহার (সম্পূর্ণ gzip'd ডাম্প 1.25 GiB), প্রকৃতির জিনিসগুলি নিয়ে ভাবছি।

টেবিল স্কিমাটি হ'ল:

# \d twitter_interactions
                Table "public.twitter_interactions"
         Column          |            Type             | Modifiers 
-------------------------+-----------------------------+-----------
 interaction_id          | character(36)               | not null
 status_text             | character varying(1024)     | not null
 screen_name             | character varying(40)       | not null
 twitter_user_id         | bigint                      | 
 replying_to_screen_name | character varying(40)       | 
 source                  | character varying(240)      | not null
 tweet_id                | bigint                      | not null
 created_at              | timestamp without time zone | not null
Indexes:
    "twitter_interactions_pkey" PRIMARY KEY, btree (interaction_id)
    "twitter_interactions_tweet_id_key" UNIQUE, btree (tweet_id)
    "index_twitter_interactions_on_created_at" btree (created_at)
    "index_twitter_interactions_on_screen_name" btree (screen_name)
Triggers:
    insert_twitter_interactions_trigger BEFORE INSERT ON twitter_interactions FOR EACH ROW EXECUTE PROCEDURE twitter_interactions_insert_trigger()
Number of child tables: 9 (Use \d+ to list them.)

উত্তর:


13

আমি ইউআইডি টাইপ পরিবর্তন করতে বিবেচনা করব। char(36)40 বাইট uuidনেয়, 16 লাগে, তাই আপনি প্রতি সারিতে 24 বাইট সংরক্ষণ করবেন, যা আপনার জন্য এক বছরের 12 এমবি, এক বছরের পরে 4 জিবি হবে। প্লাস সূচকগুলি। আপনার কাছে কি হার্ডওয়্যার নির্ভর করে, এটি খুব বেশি নয় তবে এটি হতে পারে be আপনার যদি আরও উন্নতির সুযোগ থাকে তবে এটি যুক্ত হয়।

এছাড়াও, আমি আপনার স্কিমাতে কোনও বাধা দেখছি না যা এটি নিশ্চিত করে interaction_id এটি আসলে সঠিক ফর্ম্যাটে রয়েছে। সঠিক টাইপ ব্যবহার করা আপনাকে সেটিও দেবে।

আপনি যদি এটি পছন্দ করেন তবে ব্যবহারের চেয়ে bigintআরও বেশি সাশ্রয় হবে এবং আরও ভাল পারফরম্যান্স থাকবে। আপনার অ্যাপ্লিকেশনটি এত বড় যে bigintকোনও আইডি কলামের জন্য কাজ করবে না এটি খুব সম্ভব নয়।


আমার বিতরণ করা সিস্টেম আছে: একাধিক তথ্যের উত্স ইন্টারঅ্যাকশনের জন্য আইডি উত্পন্ন করে, সুতরাং আমি নোড আইডির জন্য এন বিট সংরক্ষণ না করে আমি একটি সরল বিজিআইএনটি ব্যবহার করতে পারি না।
ফ্রান্সোইস বিউসোলিল

3
@ ফ্রানসোইসবিউসোলিল, নোড আইডির জন্য এন বিট সংরক্ষণ করা প্রতিটি এনটি নম্বরগুলিকে একটি অনুক্রমে ব্যবহার করার সমান (এবং তাই কার্যকর করা সহজ)। এছাড়াও, আপনি যৌগিক কীগুলি ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন।
অবাস্তব

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

6

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

সম্পাদনা 1

জন্য ক্যারেক্টার ডেটা Postgres, হয়েছে সেখানে তাদের জন্য একটি অতিরিক্ত স্টোরেজ খরচ নেই। সংক্ষিপ্ত স্ট্রিংগুলি, 127 বাইটের নীচে 1 বাইট ওভারহেড থাকে এবং আর কোনও 4 বাইট থাকে যা দ্বিতীয় উত্তরদাতা 36 বাইট ক্ষেত্রের জন্য 40 বাইট ব্যয় নিয়ে আসে। তবে স্ট্রিং সংক্ষেপণের জন্য একটি বিকল্পও রয়েছে তাই সম্ভবত এটির জন্য সম্পূর্ণ 40 টাকা খরচ হবে না the চূড়ান্ত ব্যয়টি কী হবে তা আমি বলতে পারছি না তবে মৌলিকাগুলি রয়ে গেছে: 16 বাইটের বেশি কিছু স্টোরেজ ব্যয় বাড়িয়ে দেবে, পড়তে বেশি সময় নিবে এবং আরও স্মৃতি গ্রহণ।

একটি সংক্ষিপ্ত স্ট্রিংয়ের জন্য স্টোরের প্রয়োজনীয়তা (126 বাইট পর্যন্ত) 1 বাইট প্লাস প্রকৃত স্ট্রিং, যা চরিত্রের ক্ষেত্রে স্পেস প্যাডিং অন্তর্ভুক্ত করে। দীর্ঘতর স্ট্রিংগুলিতে ১ টির পরিবর্তে ওভারহেডের 4 বাইট থাকে Long লম্বা স্ট্রিংগুলি সিস্টেম স্বয়ংক্রিয়ভাবে সংকুচিত হয়, তাই ডিস্কে শারীরিক প্রয়োজন কম হতে পারে।


3

স্থান সমস্যাটি ছাড়াও এটি মনে রাখবেন যে সঠিক ডেটা টাইপ ব্যবহার করতে আপনাকে প্রতিটি টেবিল পরিবর্তন করতে হবে বা আপনার যোগদানের পারফরম্যান্সটি খারাপভাবে বদলে যাবে।


এটি দেওয়া হয়েছিল, তবে আমাকে মনে করিয়ে দেওয়ার জন্য ধন্যবাদ।
ফ্রেঞ্চোইস বিউসোলিল

3
এই জাতীয় বড় পরিবর্তনগুলি করার সময় আমি দেখতে পাই যে সবকিছু লিখে রাখা (জিনিসটি মনে রাখা যত সহজ সরল হোক না কেন) সাধারণত পরিশোধ করা হয়।
mrdenny

3

তথ্য এবং সূচকের আকারে সঞ্চয় করার পাশাপাশি (অন্যেরা বলেছিলেন) যা আই / ও সঞ্চয়ীগুলিতে অনুবাদ করে, আপনাকে যে বিষয়টি বিবেচনা করতে হবে তা হ'ল আপনি কীভাবে নতুন মান তৈরি করবেন interaction_idএবং এর প্রভাব কী হবে সূচি এবং ক্যোয়ারির শর্তাদি (যোগ দেয়)।

সূচকের জন্য - এটি আরও ছোট হবে তবে আপনার প্রশ্নগুলির অনেকগুলি যদি ইউআইডিগুলিতে স্যুইচ করা সূচক স্ক্যানগুলি ব্যবহার করে তবে সূচি স্ক্যানগুলি অসম্ভব রেন্ডার করতে পারে (আপনি ইউইউডিগুলি কীভাবে উত্পন্ন করবেন তার উপর নির্ভর করে) এবং bigintআরও ভাল পছন্দ হতে পারে।

অবশেষে, প্রকৃত পারফরম্যান্সের প্রভাবটি আপনার ব্যবহারের ধরণ এবং ডেটা বিতরণের উপরও নির্ভর করে আপনার পরীক্ষা চালানো উচিত এবং একটি বিকাশ এবং পরীক্ষার পরিবেশ থাকতে হবে যাতে আপনি নিজের পরিবর্তনগুলি পরীক্ষা করতে পারেন।

এটি আপনাকে পারফরম্যান্সের প্রভাব সম্পর্কে আরও সঠিক উত্তর দেবে।


দরকারী অবদানের জন্য ধন্যবাদ এবং সাইটে আপনাকে স্বাগত জানাই :)
জ্যাক বলছেন topanswers.xyz

আমার অ্যাক্সেস নিদর্শনগুলি তারিখের সীমাগুলির মধ্যে, স্ক্রিন_নাম ব্যবহার করে যোগদান করা, বা ইউইউডি দ্বারা by অনন্য আইডিতে কোনও ব্যাপ্তি স্ক্যান প্রত্যাশিত নয়। আপনার উত্তরের জন্য ধন্যবাদ, খুব তথ্যপূর্ণ।
ফ্রেঞ্চোইস বিউসোলিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.