কোনও টেবিলের ক্ষেত্রটি সর্বাধিক স্বাক্ষরিত বা স্বাক্ষরযুক্ত 32 বিট পূর্ণসংখ্যার কাছে গেলে কী করবেন?


14

কোনও প্রদত্ত ডাটাবেসে যা অনন্য অটো-ইনক্রিমেন্ট ক্ষেত্রের আকারে (উদাহরণস্বরূপ, আন্তঃ-ব্যবহারকারী বার্তাগুলি) ব্যবহারকারীর রেকর্ড ধারণ করে ... সময় আসার পরে কী করা উচিত এবং এটি সর্বাধিক স্বাক্ষরিত বা স্বাক্ষরযুক্ত নম্বরের কাছে পৌঁছায় বর্তমান ডেটাটাইপের? (একটি 32-বিট INT)? আমি অনুমান করছি যে পরবর্তী ডাটাবেসে ডাটাবেস সার্ভারটি যখন (2-232) -1 নম্বর নির্ধারণ করার চেষ্টা করবে তখন উপচে পড়বে, সুতরাং কীভাবে এড়াতে হবে (প্রশ্নের প্রয়োজনে ডেটাটাইপ পরিবর্তন না করে) এবং রেকর্ড যুক্ত করে রাখি? আপনি কি করতে চান?

আমি কেন আইএনটি ব্যবহার করব এবং উদাহরণস্বরূপ, ভর্চারস?

আমি নিজেকে এই অনুমানমূলক প্রশ্ন জিজ্ঞাসা করে বেশ কয়েক দিন হয়ে গেছে এবং আমি একজন পেশাদার কী করবে তা জানতে চাই।

উত্তর:


12

আপনি সাধারণত ভার্চারের পরিবর্তে পূর্ণসংখ্যার ব্যবহার করতে পারেন কারণ তারা কম স্থান গ্রহণ করে, ভালভাবে বোঝা গেছে বাছাই করার ধরণটি সূচকের পক্ষে দ্রুত হয় Inte পূর্ণসংখ্যাগুলি একটি সিপিইউর প্রাকৃতিক ডেটা ধরণের, এবং তাই কার্য সম্পাদন সাধারণত অনুকূল generally সাধারণত একটি পূর্ণসংখ্যা 4 বাইট হয়, একটি (নন-ইউনিকোড) বার্চারে কেবল 4 টি অক্ষরের সমতুল্য।

যদি আপনি কোনও INT প্রকারের সাথে মহাশূন্যের বাইরে চলে যাওয়ার বিষয়ে উদ্বিগ্ন হয়ে থাকেন তবে বিগিন্ট চেষ্টা করুন, যা আপনাকে 8-বাইট নম্বর দেয়। এটির সীমাটি বেশ বিশাল, এবং রেকর্ডের এই সীমাটি পৌঁছানোর আগে আপনি সম্ভবত ডিস্কের জায়গা ছাড়িয়ে গেছেন :-) বিগিন্টের পারফরম্যান্সও খুব ভাল হতে চলেছে, বিশেষত অনেক সার্ভার এখন 64৪-বিট খুব বেশি ।

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

অবশেষে, আমি মাইএসকিউএল সম্পর্কে জানি না, তবে এসকিউএল সার্ভার যদি সীমাতে পৌঁছে যায় তবে একটি ওভারফ্লো ত্রুটি দেবে।


1
আমি এইরকম বিস্তারিত উত্তর দিয়ে সন্তুষ্ট। VARCHAR, INT এবং BIGINT চুক্তির ব্যাখ্যার জন্য ধন্যবাদ। যেহেতু প্রশ্নটি কাল্পনিক, তাই আমি বিস্মিত হই যে বিগিন্টের সীমাও পৌঁছে গেলে কী হবে। প্রশ্নটি ফেসবুকে আইএনটি ব্যবহার এবং সীমাতে পৌঁছানোর বিষয়ে দেখেছি এমন একটি পোস্ট দ্বারা উত্থাপিত হয়েছিল এবং আমি এটি সম্পূর্ণরূপে সম্ভব হিসাবে দেখছি। সংরক্ষণাগারটি কাজ করবে, বা শর্তাধীন বিবৃতি সহ একটি দ্বিতীয় টেবিল তৈরি করবে (যা আপনি বলেছিলেন যে, স্ক্রিপ্টগুলিও আপডেট করা দরকার, এবং এটি জটিলও হবে)। সামগ্রিকভাবে, দুর্দান্ত উত্তর। আমি সময় গ্রহণ প্রশংসা করি।
এয়ারক্রস

9

একটি উপেক্ষিত বিন্দুটি হ'ল অনেক লোক অটল নম্বর বা পরিচয় 1 এ শুরু করে এভাবে তত্ক্ষণাত্ সম্ভাব্য পরিসরের অর্ধেক হ্রাস করে (স্বাক্ষরিত জন্য)

এক্ষেত্রে ইনক্রিমেন্ট -১ এ শুরু করার জন্য আপনি কেবল নম্বরটি নতুনভাবে সংজ্ঞায়িত করতে চান।

তর্কযুক্তভাবে, আপনি যদি কখনও নিজের পরিচয় কলামটি পূরণ করার প্রত্যাশা করেন তবে আপনার এটির নকশা করা উচিত ছিল এবং শুরুতে একটি বৃহত্তর ডেটাটাইপ ব্যবহার করা উচিত।

এই সাম্প্রতিক প্রশ্নটি ওয়ানও দেখুন: এসকিউএল সার্ভার ২০০৮: পরিচয় যদি সর্বাধিক মানের চেয়ে বেশি হয়?


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

বিকল্পভাবে -1 থেকে -1 বৃদ্ধি ব্যবহারের জন্য, (-2147483648) থেকে শুরু করুন এবং 1 দ্বারা বৃদ্ধি বৃদ্ধি করুন তবে হ্যাঁ, আপনি INT_MAX অতিক্রম করার পরে আপনার নকশাটি পুনর্বিবেচনা করা দরকার, এবং এটির পরিবর্তে পুরানো সূচি অপসারণ করতে হবে একটি নতুন বৃহত্তর একটি সঙ্গে। এবং আপনি যদি স্বাক্ষরবিহীন BIGINT পাস করেন তবে আমি আপনার টিমে কাজ করতে চাই;)
jcolebrand

পোস্টগ্রাইএসকিউএল আইডি নম্বর উত্পন্ন করতে ক্রম ব্যবহার করে; ক্রিয়েট সিকোয়েন্স স্টেটমেন্ট আপনাকে সাইকিল নির্দিষ্ট করতে দেয়, যা সর্বাধিক মান পর্যন্ত পৌঁছালে কেবল চারপাশে মোড়ানো হবে। (বা ন্যূনতম মান, আপনি যদি অন্য দিকে চলে যাচ্ছেন)) সাইকিল বিকল্পটি এখন এসকিউএল স্ট্যান্ডার্ডগুলিতে। (কমপক্ষে 2003 সাল থেকে।)
মাইক শেরিল 'ক্যাট রিকল'

4

BIGINT ওভারফ্লো? হা হা। প্রথমে কীভাবে অমরত্ব অর্জন করবেন তা নির্ধারণ করুন। INS UNSIGNED (4 বিলিয়ন) পৌঁছনো যথেষ্ট শক্ত hard প্রতি সেকেন্ডে 100 INSERTs এক বছরে INT উপচে পড়া INT এর কাছাকাছি আসবে। BIGINT কয়েক বিলিয়ন বছর সময় নিতে পারে।

সমাধানের জন্য: টেবিল foo মোডিফাই কলম আইডি বিগিন্ট নিখরচায় নয় স্বয়ংক্রিয়িকরণ; তবে এতে সময় লাগবে কারণ এটি টেবিলের অনুলিপি করবে (যার কাছে প্রায় 4 বিলিয়ন সারি রয়েছে?) এবং সমস্ত মাধ্যমিক সূচকগুলি পুনর্নির্মাণ করবে rebu এগিয়ে পরিকল্পনা.

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

CHAR বা VARCHAR নিঃশব্দে উপলব্ধ স্থানটিতে ছাঁটা হয়েছে।

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