'বিশাল' ডাটাবেস টেবিল পিকে জন্য সিক্যুয়াল জিইউইড বা বিগিন্ট


14

আমি জানি এই ধরণের প্রশ্ন অনেকটা উঠে আসে তবে এই সিদ্ধান্ত নিতে আমাকে সহায়তা করার জন্য আমি এখনও কোনও বাধ্যতামূলক যুক্তি পড়তে পারি নি। আমার সাথে সহ্য করুন!

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

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

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

মূলত, আমি যা জানতে চাই তা হ'ল যদি আমি অন্য কোন বিবেচ্য বিষয়টিকে অগ্রাহ্য করেছি। এই মুহুর্তে, আমি ঝাঁপিয়ে পড়তে এবং জিইউইডি ব্যবহার শুরু করার দিকে ঝুঁকে পড়েছি। আমি কোনও উপায়েই কোনও ডাটাবেস বিশেষজ্ঞ নই, তাই আমি যে কোনও দিকনির্দেশনাটির সত্যই প্রশংসা করব।


2
আপনি কীভাবে একটি "অনুক্রমিক জিইউইডি" তৈরি করবেন?

এটি একটি কাস্টম বাস্তবায়ন। এটি মূলত একটি জিইউডি-টাইপ ফর্ম্যাট যা 6 টাইস স্ট্যাম্প বাইট দ্বারা প্রতিস্থাপন এবং 2 বাইট যা ক্রম সংখ্যাটি উপস্থাপন করে যেখানে টাইমস্ট্যাম্পটি একই। নিখুঁত অনুক্রমিক মানগুলি উত্পাদন করার গ্যারান্টিযুক্ত নয়, তবে সূচি খণ্ডনকে আমার জন্য নন-ইস্যু হিসাবে তৈরি করা যথেষ্ট ভাল।

সুতরাং আপনি একাধিক বিভিন্ন উত্স থেকে এই ডেটা লোড করছেন? আমি আরও ধরে নিচ্ছি যে খণ্ড খণ্ডিত সম্পর্কে আপনি যে সূচককে চিন্তিত করছেন তা কি ক্লাস্টার্ড সূচক?

2
আপনি যদি অনুক্রমিক জিইউইডি নিয়ে যাচ্ছেন তবে আপনার NEWSEQUENTIALID () দেখতে হবে। এটি আপনি যা চান তা করা উচিত (একঘেয়েভাবে বৃদ্ধি), এবং কাস্টম কোডের উপর নির্ভর করে না।

2
ভাল পড়ার কীগুলি নিয়ে ঝামেলা বিষয়ক যিরমিয় পেশকা পোস্টটি দেখুন এবং তিনি এই প্রয়োগগুলি বহুবার পেরেছিলেন ।
বিলিংক

উত্তর:


4

আমিও একই অবস্থা বর্তমানে, আমি সিক্যুয়াল জিইউইড পদ্ধতির ব্যবহার করছি এবং কোনও বিভাজন এবং সহজ কী প্রজন্ম নেই।

আমি দু'টি বিপর্যয় লক্ষ্য করেছি যেগুলি আমাকে কস্মিতে স্থানান্তরিত করতে শুরু করেছে:

  1. স্থান ব্যবহার । সূচক প্রতি 8 বাইট বেশি 10 টি সূচক বা তার দ্বারা গুণিত করুন এবং আপনি বিশাল জায়গার অপচয় পান।
  2. কলাম স্টোর সূচীগুলি জিইউডিগুলিকে সমর্থন করে না।

(2) আমার জন্য হত্যাকারী ছিল।

আমি এখন আমার কীগুলি এটির মতো তৈরি করব:

yyMMddHH1234567890

আমি একটি নেতৃস্থানীয় তারিখ প্লাস ঘন্টা ব্যবহার করব এবং তার পরে অনুক্রমিক অংশ পাব । এটি আমাকে কোনও অতিরিক্ত সূচি ছাড়াই তারিখ অনুসারে আমার ডেটা পরিসীমা-জিজ্ঞাসা করার অনুমতি দেয়। এটি আমার জন্য একটি দুর্দান্ত বোনাস।

আমি bigint একটি ব্যবহারের অনুক্রমিক অংশ তৈরি করে দেব হিলো অ্যালগরিদম নিজেই হচ্ছে ভাল ধার দেয় বিতরণ

আশা করি এর কিছুটি আপনার পরিস্থিতিতে স্থানান্তরিত হয়। আমি অবশ্যই বিগিন্ট ব্যবহার করার পরামর্শ দিচ্ছি।


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

3

INT1 থেকে শুরু করে এক ধরণের সাহায্যে আপনি 2 বিলিয়নেরও বেশি সারি পেয়ে যাবেন - এটি বেশিরভাগ ক্ষেত্রেই যথেষ্ট পরিমাণে হওয়া উচিত। এর সাথে BIGINT, আপনি মোটামুটি 922 কোয়াড্রিলিয়ন পান (922 টি 15 জিরো - 922'000 বিলিয়ন) - আপনার পক্ষে যথেষ্ট?

আপনি যদি প্রথমটি INT IDENTITYশুরুতে ব্যবহার করেন এবং প্রতি সেকেন্ডে আপনি একটি সারি সন্নিবেশ করেন, 2 বিলিয়ন সীমাটি আঘাত করার আগে আপনার 66.5 বছর প্রয়োজন ...

আপনি যদি BIGINT IDENTITYপ্রথম থেকে শুরু করে ব্যবহার করেন এবং আপনি প্রতি সেকেন্ডে এক হাজার সারি সন্নিবেশ করান, আপনি 922 কোয়াড্রিলিয়ন সীমাটি আঘাত করার আগে 292 মিলিয়ন বছর আগে আপনার মনে জাগ্রত হওয়া দরকার ...

আপনার প্রতিদিন 10 মিলিয়ন সারি ব্যবহার করে, আপনার কাছে প্রায় 1'844'674'407'370 দিন ( 1844 বিলিয়ন দিন বা 5 মিলিয়ন বছরের বেশি টিক ) ডেটা রয়েছে - এটি আপনার প্রয়োজনের জন্য যথেষ্ট যথেষ্ট? ?

এমএসডিএন বুকস অনলাইনে এটি সম্পর্কে (সমস্ত বিকল্পের সাথে রয়েছে) আরও পড়ুন ।


1
প্রতিদিন 10 মিলিয়ন সারি সন্নিবেশনের হার 200 দিনের মধ্যে INT সীমাটি সরিয়ে দেবে।
mceda

@ এমসিডা: হ্যাঁ - আমি কি অন্য কিছু দাবি করেছি? এটি BIGINTএত দ্রুত পরিসীমা
ছাড়ায় না

ধন্যবাদ, তবে আমি যেমন আমার প্রশ্নে বলেছিলাম, ডাটাবেসে প্রেরণের আগে আমার আইডি দরকার। ডেটা আপেক্ষিক, সুতরাং এটির প্রচুর অনুলিপি করার আগে আমাকে প্রাথমিক এবং বিদেশী কীগুলি অর্পণ করতে হবে। যদি এটি এর জন্য না হয়, একটি পরিচয় বিগিন্ট সম্ভবত নিখুঁত হবে।

2
@ বারগুয়াস্ট: আপনি কি কেবলমাত্র নিজের ডেটা স্টেজিং টেবিলের (পরিচয় ব্যতীত) বাল্ক-inোকাতে পারবেন না এবং তারপরে সেখান থেকে আপনার প্রকৃত ডেটা টেবিলগুলিতে ব্যবহার করতে পারেন BIGINT IDENTITY?
marc_s

@ মার্কস: হ্যাঁ, প্রদত্ত গণনাটি প্রশ্নের সাথে একত্রিত হয়নি: "আপনি যদি 1 থেকে শুরু করে কোনও INT পরিচয় ব্যবহার করেন এবং আপনি প্রতি সেকেন্ডে একটি সারি সন্নিবেশ করেন, 2 বিলিয়ন সীমাটি আঘাত করার আগে আপনার 66.5 বছর প্রয়োজন হবে"।
mceda

2

আমি আপনাকে এসকিউএল ২০১২-তে বিগিন্ট ডেটা টাইপের সিকোয়েনস ব্যবহার করার পরামর্শ দিচ্ছি এটি ক্যাশে / নোকেশের মতো বিকল্পগুলির সাথে পরিচয়ের চেয়ে অনেক বেশি নমনীয়, আপনি sp_sequence_get_range হিসাবে আপনার ব্যাচের ক্রিয়াকলাপের জন্য সিকোয়েন্স রেঞ্জও নির্ধারণ করতে পারেন।


দুর্ভাগ্যক্রমে, এসকিউএলসিএল স্কেল আউজুরে সমর্থিত নয়।
টিমোথি লি রাসেল

2

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

সিওএমবি আইডি / সিক্যুয়াল জিইউডি কৌশলটি যার সাথে আমি পরিচিত এবং এটি কার্যকরভাবে যে কোনও সময় আপনার কার্যকরভাবে ডাটাবেসের বাইরে নির্ধারিত বিশ্বব্যাপী স্বতন্ত্রতার প্রয়োজন হয় - এটি কার্যকরভাবে ডাটাবেসের ভিতরে এবং বাইরে উভয়ই ব্যবহারযোগ্য সারি পরিচয়। যে কারণে উচ্চ-বিতরণ করা পরিবেশ বা সংযোগ বিচ্ছিন্ন পরিস্থিতিতে, এটি একটি ঠিক আছে

যদি আপনার সত্যিই এটির প্রয়োজন না হয় তবে ব্যতীত , কারণ অতিরিক্ত প্রস্থের পার্থক্য তাত্পর্যপূর্ণ যখন ডেটার আকার বৃদ্ধি পায় এবং এই কীগুলি প্রতিটি সূচকে থাকে এবং প্রচুর অনুসন্ধানের জন্য ওয়ার্কিং সেটে থাকে।

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


0

উভয় টেবিলের মধ্যে ডেটা andোকানো এবং পরিচয় ক্ষেত্রের সাথে সম্পর্কিত থাকতে সাধারণভাবে কমান্ড OUTPUTঅফ INSERTকমান্ড ব্যবহার করা সম্ভব ।

টাইমস্ট্যাম্পের উপর ভিত্তি করে চিহ্নিতকারীকে নির্ভরযোগ্য হিসাবে বিবেচনা করা উচিত নয় - এটি সিস্টেম ঘড়ির উপর নির্ভর করে যা ঘুরেফিরে অনেকগুলি উপর নির্ভর করে - হার্ডওয়্যার ক্লক থেকে সময় সমন্বয় পরিষেবাদি পর্যন্ত।

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