বড় আইডি মান এড়ানোর কারণ


17

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

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

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

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

অ্যাপ্লিকেশনটি খুব বড় পরিমাণে ডেটা পরিচালনা করবে বলে আশা করা যায় না। আমি সন্দেহ করি যে এটি পরের কয়েক বছরের মধ্যে 10 000 প্রকৃত রেকর্ডে পৌঁছে যাবে।

যদি এটি কোনও পার্থক্য করে তবে আমরা মাইক্রোসফ্ট এসকিউএল সার্ভারটি ব্যবহার করছি। অ্যাপ্লিকেশনটি সি # তে লিখিত আছে এবং লিনক থেকে এসকিউএল ব্যবহার করে।

হালনাগাদ

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

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

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


এ এস এম আহসান হাবিব এর পোস্ট দেখুন codeproject.com/Tips/668042/...
RLF

আপনি কি স্পষ্ট করতে পারেন? নতুন আইডিগুলি কি সহজেই 10000 মান পায়? নাকি নতুন আইডিতে 10000 এর ফাঁক রয়েছে? এবং ভবিষ্যতের অ্যাপ্লিকেশন জীবনে কয়টি আইডি লাগবে বলে অনুমান করা হয়?
ব্যবহারকারী 2338816

1
প্রথম অব্যবহৃত আইডি সন্ধানের বিষয়ে, বিল কারভিনের "এসকিউএল অ্যান্টিপ্যাটার্নস" বইটিতে হুবহু একটি অধ্যায় রয়েছে। তাই হ্যাঁ, এটি অবশ্যই একটি অ্যান্টিপ্যাটার্ন হিসাবে দেখা যেতে পারে!
টমাস প্যাড্রন-ম্যাকার্থি

উত্তর:


24

কোড না দেখে, কী ঘটছে তা নির্ধারণে বলা খুব শক্ত। যদিও, সম্ভবত IDENTITYমানটি ক্যাশে হচ্ছে, এসকিউএল সার্ভারটি পুনরায় চালু হওয়ার পরে মানটির ফাঁক সৃষ্টি করে। সে সম্পর্কে কয়েকটি ভাল উত্তর এবং তথ্যের জন্য /programming/17587094/identity-column-value-s अचानक en- jumps- to- 1001- in- sql- server দেখুন ।

একটি সাধারণ INTক্ষেত্রটি 2,147,483,647 অবধি মান ধরে রাখতে পারে। আপনি সত্যের পরিচয় মানটি -2,147,483,648 এ শুরু করতে পারেন, মানগুলির একটি পুরো 32 বিট প্রদান করে। 4 বিলিয়ন স্বতন্ত্র মান। আমি সন্দেহ করি আপনি ব্যবহারের মান খুব কমই চলেছেন। ধরে নেওয়া যাক আপনার আবেদন করা হয় প্রতিটি প্রকৃত সারি যোগ জন্য 1,000 মান গ্রাসকারী, আপনি 6 মাসের অভিমানী আপনাকে শুরু মধ্যে ID- র ফুরিয়ে প্রতিদিন দৈনিক প্রায় 12,000 সারি তৈরি করা প্রয়োজন চাই IDENTITY0 এ মান, এবং কোন int ব্যবহার করে। আপনি যদি একটি বিজিআইএনটি ব্যবহার করছিলেন তবে আপনি যদি প্রতি দিন 12,000 সারি লেখেন, প্রতি সারি 1,000 "মান" গ্রহন করে আপনার মূল্যবোধের বাইরে চলে যাওয়ার আগে 21 মিলিয়ন শতাব্দী অপেক্ষা করতে হবে।

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

আপনি যদি আইডি কলামের জন্য নিজস্ব মানগুলি পরিচালনা করতে চেয়েছিলেন তবে আপনি একটি মূল সারণী তৈরি করতে এবং এই প্রশ্নের উত্তরে দেখানো একটি পদ্ধতি ব্যবহার করে একটি দুর্দান্ত বুলেটপ্রুফ পদ্ধতি সরবরাহ করতে পারেন: কোনও কী টেবিলের সাথে একত্রে অ্যাক্সেস সামঞ্জস্য করা এসকিউএল সার্ভারে ডেডলকস

অন্য বিকল্পটি ধরে নিলে আপনি এসকিউএল সার্ভার 2012+ ব্যবহার করছেন, কলামটির SEQUENCEআইডি মান পেতে কোনও অবজেক্ট ব্যবহার করা হবে। তবে আপনাকে মানগুলি ক্যাশে না করার জন্য ক্রমটি কনফিগার করতে হবে। উদাহরণ স্বরূপ:

CREATE SEQUENCE dbo.MySequence AS INT START WITH -2147483648 INCREMENT BY 1 NO CACHE;

আপনার বসের "উচ্চ" সংখ্যার নেতিবাচক ধারণার জবাবে, আমি বলব এতে কী পার্থক্য রয়েছে? আপনি একটি ব্যবহার ধরে নেওয়া যাক INTএকটি সঙ্গে ক্ষেত্র, IDENTITY, আপনি আসলে শুরু করতে পারে IDENTITY2147483647এবং "বৃদ্ধি" দ্বারা মান -1। এই 4 একেবারে মেমরির খরচ, কর্মক্ষমতা, বা ডিস্ক একটি 32 বিট সংখ্যা যেহেতু ব্যবহার করা স্থান থেকে কোন পার্থক্য নেই বাইট, কোন ব্যাপার হবে যদি তা না হয় 0বা 21474836470বাইনারি হয় 00000000000000000000000000000000যখন 32-বিট স্বাক্ষরিত INTক্ষেত্রে সংরক্ষণ করা হয়। 2147483647হয়01111111111111111111111111111111- উভয় সংখ্যা স্মৃতিতে এবং ডিস্কে উভয়ই যথাযথভাবে একই পরিমাণে গ্রহণ করে এবং উভয়ই প্রক্রিয়া করতে একই পরিমাণে একই পরিমাণ সিপিইউ অপারেশন প্রয়োজন require কোনও মূল ক্ষেত্রে সংরক্ষিত প্রকৃত সংখ্যা সম্পর্কে অবলম্বন করার চেয়ে আপনার অ্যাপ্লিকেশন কোডটি সঠিকভাবে ডিজাইন করা আরও গুরুত্বপূর্ণ।

আপনি (ক) বৃহত্তর-সক্ষমতা আইডি কলাম যেমন কোনও BIGINT, বা (খ) আইডি ফাঁকগুলি রোধ করতে আপনার নিজের সমাধানটি ঘূর্ণায়মান ব্যবহারের পক্ষে এবং বিবাদগুলি সম্পর্কে জিজ্ঞাসা করেছেন । এই উদ্বেগের উত্তর দিতে:

  1. BIGINTপরিবর্তে INTপ্রশ্নে কলামের ডেটা-টাইপ হিসাবে। একটি ব্যবহারের BIGINTজন্য অন-ডিস্ক উভয় পরিমাণ সঞ্চয়স্থান এবং কলামের জন্য মেমরির প্রয়োজন। যদি কলামটি জড়িত টেবিলের প্রাথমিক কী সূচক হয় তবে টেবিলের সাথে সংযুক্ত প্রতিটি অ-ক্লাস্টারযুক্ত সূচকও BIGINTমানটি সঞ্চয় করে আনবে INT, আবার মেমরি এবং অন ডিস্ক উভয়ের আকারের দ্বিগুণ । এসকিউএল সার্ভার 8KB পৃষ্ঠাগুলিতে ডিস্কে ডেটা সঞ্চয় করে, যেখানে "পৃষ্ঠায়" প্রতি "সারি" সংখ্যা প্রতিটি সারির "প্রস্থ" উপর নির্ভর করে। সুতরাং, উদাহরণস্বরূপ, যদি আপনার কাছে 10 টি কলাম, একটি করে প্রতিটি টেবিল থাকে তবে আপনি INTপ্রতি পৃষ্ঠায় প্রায় 160 টি সারি সঞ্চয় করতে সক্ষম হবেন। যদি সেই কলামগুলি পরিবর্তে যেখানে থাকেBIGINTকলামগুলি, আপনি কেবলমাত্র প্রতি পৃষ্ঠায় 80 টি সারি সঞ্চয় করতে সক্ষম হবেন। খুব বড় সংখ্যক সারি সহ একটি টেবিলের জন্য, এর পরিষ্কারভাবে অর্থ হল যে টেবিলটি পড়তে এবং লিখতে হবে যে কোনও সারি সংখ্যার জন্য এই উদাহরণে দ্বিগুণ হবে। এটা ঠিক যে, এই একটি চমত্কার চরম উদাহরণ - যদি আপনি একটি একক গঠিত একটি সারিতে ছিল INTবা BIGINTকলাম ও একটি একক NCHAR(4000)কলাম, আপনি (সরলভাবে) প্রতি পাতায় অবশ্যই একটি একক সারি পেয়ে, কিনা আপনি একটি ব্যবহৃত হতে চাই INTবা BIGINT। এই পরিস্থিতিতে, এটি খুব প্রশংসনীয় পার্থক্য করতে পারে না।

  2. আইডি কলামের ফাঁকগুলি রোধ করতে আপনার নিজের দৃশ্যের রোলিং। আপনার কোডটি এমনভাবে লিখতে হবে যে ব্যবহারের জন্য "পরবর্তী" আইডি মান নির্ধারণের সাথে টেবিলের সাথে সংঘটিত অন্যান্য ক্রিয়াগুলির সাথে বিরোধ নেই conflict SELECT TOP(1) [ID] FROM [schema].[table]নির্লজ্জতার লাইন ধরে কিছু মনে আসে। যদি একাধিক অভিনেতা একসাথে টেবিলে নতুন সারি লেখার চেষ্টা করছেন? দুটি অভিনেতা সহজেই একই মান অর্জন করতে পারে, যার ফলে লেখার বিরোধ ঘটে। এই সমস্যাটি ঘুরে দেখার জন্য টেবিলের অবিবাহিত অ্যাক্সেস, কর্মক্ষমতা হ্রাস করা দরকার। এই সমস্যাটি সম্পর্কে অনেকগুলি নিবন্ধ লেখা হয়েছে; আমি বিষয়টিতে একটি অনুসন্ধান করার জন্য এটি পাঠকের কাছে রেখে দেব

এখানে উপসংহারটি হ'ল: আপনাকে আপনার প্রয়োজনীয়তা বুঝতে হবে এবং আপনার অ্যাপ্লিকেশনটির সম্মতিযুক্ত প্রয়োজনীয়তার সাথে সারিগুলির সংখ্যা এবং সারির প্রস্থ উভয়ই সঠিকভাবে অনুমান করতে হবে। যথারীতি এটি নির্ভর করে ™


4
+1 তবে আমি বিগিন্টের স্থানের প্রয়োজনীয়তাগুলি বাতিল করব না। ডিস্কে স্থানের জন্য এত বেশি নয় বরং মেমরিতে আই / ও এবং স্থান নষ্ট হয়। আপনি ডেটা সংক্ষেপণ ব্যবহার করে এর প্রচুর পরিমাণে অফসেট করতে পারেন, যাতে আপনি 2 বিলিয়ন ছাড়িয়ে না যাওয়া পর্যন্ত BIGINT প্রকারের সত্যতা অনুভব করেন না। আদর্শভাবে তারা কেবল সমস্যাটি সমাধান করবে (আমি সেটিকে প্রতি বাগ হিসাবে ডাকতে সংকোচ করি) - যদিও লোকেরা ফাঁকগুলি সম্পর্কে যত্ন নেবে না এবং লোকেরা তাদের সার্ভারগুলি দিনে 15 বার পুনরায় চালু না করা উচিত, আমাদের উভয় পরিস্থিতিতেই এই পরিস্থিতি রয়েছে বেশ প্রচলিত, এবং প্রায়শই টেন্ডেমে।
হারুন বারট্রান্ড

3
খুব বৈধ পয়েন্ট, হারুন, যথারীতি। আমি যাইহোক যাইহোক একটি আইএনটি ব্যবহারের দিকে ঝোঁক দেব, যেহেতু তারা বিশাল সংখ্যক সারি আশা না করে বিগিন্ট মোটামুটি মোট ওভারকিল।
ম্যাক্স ভার্নন

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

2
@ ব্যবহারকারী 2338816 এটাই মূল বিষয় - যদি টেবিলটি বড় হয়ে যায়, স্মরণে অনেকগুলি থাকবে। এবং যেহেতু পরিচয় কলামটি সাধারণত ক্লাস্টারিং কী, এটি প্রতিটি সূচকেও প্রতিটি একক সারির জন্য অতিরিক্ত 4 বাইট। এটি প্রতিটি ক্ষেত্রেই কি গুরুত্বপূর্ণ হবে? না, এড়িয়ে যাওয়া উচিত? একেবারে না. দেরি না হওয়া অবধি কেউই স্কেলাবিলিটি সম্পর্কে একটি চিপ দেবে বলে মনে হয় না।
অ্যারন বার্ট্র্যান্ড

3
যদি আপনি যদিও না একটি বৈধ প্রত্যাশা আপনার প্রয়োজন হতে পারে যে আছে bigintআপনি সম্ভবত সিদ্ধান্ত যে আগাম বদলে সারি বিলিয়ান সঙ্গে একটি টেবিল করার জন্য এই যোগ করার জন্য প্রয়োজন জন্য নিজেকে ধন্যবাদ করব।
মার্টিন স্মিথ

6

করণীয় প্রধান কাজ হ'ল বর্তমান মানটি এত বেশি যে মূল কারণ তা খুঁজে বের করা।

এসকিউএল ২০১২ এর পূর্বে এসকিউএল সার্ভার সংস্করণগুলির সর্বাধিক যুক্তিসঙ্গত ব্যাখ্যা - আপনি পরীক্ষা ডাটাবেসের কথা বলছেন তা ধরে নেওয়া- এমন কোনও ক্লিনআপ পরে লোড পরীক্ষা হবে was

এসকিউএল ২০১২ দিয়ে শুরু করা সর্বাধিক সম্ভাব্য কারণ এসকিউএল ইঞ্জিনের বেশ কয়েকটি পুনঃসূচনাগুলির কারণে (প্রথম প্রদত্ত লিঙ্কটিতে বর্ণিত হিসাবে)।

ব্যবধানটি যদি কোনও পরীক্ষার দৃশ্যের কারণে ঘটে থাকে তবে আমার দৃষ্টিকোণ থেকে চিন্তার কোনও কারণ নেই। তবে নিরাপদ দিকে থাকতে আমি অ্যাপ্লিকেশনটির স্বাভাবিক ব্যবহারের সময় এবং ইঞ্জিন পুনঃসূচনা করার আগে এবং পরে সাধারণ শনাক্তকরণের মানগুলি যাচাই করতাম।

এটি "মজার" যে এমএস জানিয়েছে যে দুটি বিকল্পই (উভয়ই ট্রেস ফ্ল্যাগ 272 বা নতুন সিকিউএনসি অবজেক্ট) পারফরম্যান্সকে প্রভাবিত করতে পারে।

এমএসের পরবর্তী "উন্নতিগুলি" কভার করতে নিরাপদ পাশে থাকা আইএনটির পরিবর্তে বিগিন্ট ব্যবহারের এটি সেরা সমাধান হতে পারে ...


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

2

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

আপনার ক্ষেত্রে বিগইন্ট ব্যবহার করা অতিরিক্ত দক্ষতা অর্জন করে, যদি আপনার অ্যাপ্লিকেশন বা ডেটা ওডিবিসি (যেমন এক্সেল বা এমএস অ্যাক্সেসে আনা ইত্যাদি) এর মাধ্যমে অ্যাক্সেস করা হয় তবে এটি সমস্যা তৈরি করতে পারে, বিগিন্ট বেশিরভাগ ওডিবিসি ড্রাইভারের ডেস্কটপ অ্যাপ্লিকেশনগুলিতে ভাল অনুবাদ করে না।

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


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

1

ব্যবহৃত মানের মধ্যে একটি ফাঁক আছে? বা আরম্ভের মানগুলি 10.000 এবং তারপরে সমস্ত 1 যুক্ত করছে? কখনও কখনও যদি নম্বরটি গ্রাহকদের দেওয়া হচ্ছে, প্রাথমিক সংখ্যাটি শূন্যের চেয়ে বেশি, উদাহরণস্বরূপ 1500 বলে নেওয়া যাক, গ্রাহক বুঝতে পারবেন না যে সিস্টেমটি "নতুন"।

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

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

শুভেচ্ছা সহ


2
ওপি সার্ভিস পুনরায় আরম্ভের ফাঁক দেখছে। এটি এই সমস্যাটির কারণেই । এছাড়াও আমি মনে করি না যে একটি সংক্ষিপ্ত বিবরণ স্বল্পমেয়াদে পরবর্তী সময়ে এটি ঠিক করার জন্য গ্রহণযোগ্য কাজের জন্য একটি ভাল ট্রেড অফ।
অ্যারন বার্ট্র্যান্ড

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

@ ক্রমসচো আসলে এই উত্তরটি একটি ভাল পয়েন্ট হাইলাইট করে এমনকি যদি এটি সরাসরি আপনার প্রশ্নের সমাধান করে না: "'আইডি পুনরুদ্ধার' করার জন্য একটি প্রক্রিয়া আবিষ্কার করা ব্যয়বহুল এবং সফ্টওয়্যারটিতে ব্যর্থতা এবং জটিলতা যুক্ত করে।"
ডক্টর জে

@ ডক্টর জে আমি আপনার সাথে একমত আমি সেই ব্যক্তি যাঁর উত্তরটি উঁচু করে তুলেছিলেন :) কেবল ভুল বোঝাবুঝি পরিষ্কার করতে চেয়েছিলেন, এজন্য আমি আমার প্রথম মন্তব্যটি রেখেছিলাম।
রম্টসচো

1

আমি যদি আপনার বস হয়ে থাকি তবে অপ্রত্যাশিতভাবে উচ্চ আইডি মানগুলির কারণগুলিতে আমি সবচেয়ে আগ্রহী হব ... যেভাবে আমি এটি দেখছি, আপনি যে দুটি পরিস্থিতিতে বর্ণনা করেছেন:

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

  2. যদি টেবিলে লিখিত বেশিরভাগ রেকর্ডগুলি মুছে ফেলা হয় তবেই আমি পরিবর্তে দুটি টেবিল ব্যবহার করার বিষয়ে ভাবতে চাইব; একটি অস্থায়ী সারণী যেখানে রেকর্ডগুলি দীর্ঘমেয়াদী রাখা হয় না এবং অন্য একটি যেখানে কেবলমাত্র আমরা রেকর্ড স্থায়ীভাবে তৈরি করব তা রাখা হয়। আবার, দীর্ঘমেয়াদী রেকর্ডগুলির সংখ্যার জন্য আপনার প্রত্যাশাগুলি আমাকে আপনার মূল কলামটির জন্য একটি ছোট ধরণের ব্যবহারের পরামর্শ দেয় এবং প্রতিদিন কয়েকটি রেকর্ড আপনার পক্ষে পারফরম্যান্সের সমস্যাটিকে এক টেবিল থেকে অন্য সারণীতে 'রেকর্ড' করতে খুব কমই বাধা দেয় will এক. আমার সন্দেহ হয় যে এটি আপনার পরিস্থিতি নয়, তবে ধারণা করুন যে কোনও শপিং ওয়েবসাইট কোনও ঝুড়ি / বাস্কেটবল / আইটেম বজায় রাখতে পছন্দ করতে পারে এবং যখন অর্ডারটি আসলে অর্ডার করা হয় তখন ডেটা অর্ডার / অর্ডারআইটেম সেটে স্থানান্তরিত হয়।

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

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

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


1

বিগিন্ট ব্যবহার করা বা আমাদের নিজস্ব কোড লেখার যা কোনও আইডি বরাদ্দ করবে (কোনও ফাঁক নেই তা নিশ্চিত করার জন্য ইতিমধ্যে মুছে ফেলা রেকর্ডগুলির আইডি পুনরায় ব্যবহার করে) সেগুলির পক্ষে কী হবে?

bigintপরিচয় হিসাবে ব্যবহার করা এবং ফাঁক দিয়ে জীবনযাপন:

  • এটি সমস্ত অন্তর্নির্মিত কার্যকারিতা
  • আপনি নিশ্চিত হতে পারেন যে এটি বাক্সের বাইরে কাজ করবে
  • এটি স্থান নষ্ট করবে যেহেতু intএখনও আপনাকে প্রায় 2M দিনের ডেটা দেবে; আরও পৃষ্ঠা পড়তে হবে & লিখিত; সূচকগুলি আরও গভীর হতে পারে। (এই খণ্ডে এটি তাত্পর্যপূর্ণ উদ্বেগ নয়)।
  • একটি সারোগেট কী কলামটি অর্থহীন বোঝায় তাই ফাঁকগুলি ঠিক আছে। এটি যদি ব্যবহারকারীদের দেখানো হয় এবং ফাঁকগুলি উল্লেখযোগ্য হিসাবে ব্যাখ্যা করা হয় তবে আপনি এটি ভুল করছেন।

আপনার নিজস্ব রোল:

  • আপনার উন্নয়ন দল চিরকালের জন্য সমস্ত বিকাশ এবং বাগ ফিক্সিংয়ের কাজ করবে।
  • আপনি কি শুধু লেজ বা মাঝখানে ফাঁক পূরণ করতে চান? বিতর্ক সিদ্ধান্ত নেওয়ার জন্য।
  • একই নতুন আইডি অর্জন সহবর্তী প্রক্রিয়াগুলি রোধ করতে বা প্রতিটি পোস্টে বিরোধের সমাধানের জন্য প্রতিটি লেখায় শক্তিশালী লক দিতে হবে ।
  • সবচেয়ে খারাপ ক্ষেত্রে যদি সারিটি = 1 মুছে ফেলা হয় তবে ফাঁকগুলি বন্ধ করতে আপনাকে টেবিলের প্রতিটি সারি আপডেট করতে হবে। এটি একচেটিয়া এবং পারফরম্যান্সের হাতুড়ি তৈরি করবে, সমস্ত ক্যাসকেডিং বিদেশী কী আপডেটগুলি ইত্যাদির সাথে কী করবে etc.
  • অলস বা আগ্রহের ফাঁক পূরণ? যখন এটি ঘটছে তখন সমাবর্তনে কী ঘটে?
  • কোনও লিখিত = অতিরিক্ত বোঝার আগে আপনাকে নতুন আইডি পড়তে হবে।
  • দক্ষ ফাঁক সন্ধানের জন্য আইডি কলামে একটি সূচক প্রয়োজন হবে।

0

আপনার পিকেগুলির জন্য যদি আপনি সত্যিই আইএনটির উপরের প্রান্তকে আঘাত করার বিষয়ে উদ্বিগ্ন হন তবে জিইউডিগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন। হ্যাঁ, আমি জানি এটি 16 বাইট বনাম 4 বাইট, তবে ডিস্কটি সস্তা।

এখানে ভাল- বিপরীতে একটি ভাল লেখার ব্যবস্থা রয়েছে


4
+1 কারণ এটি একটি সমাধান, তবে কারণ হিসাবে "ডিস্ক সস্তা" হ'ল বিকল্পগুলির যত্ন সহকারে তদন্ত না করে জিইউইডিগুলি ব্যবহার করার কারণ নয় বলে একটি কারণের জন্য ম্যাক্সের উত্তরে হারুনের মন্তব্য দেখুন ।
জ্যাক ডগলাস

1
: এখানে আরও ভাল লেখার আপ একজন বিকাশকারী একটি SQL সার্ভার সূচক ও স্থাপত্য বিশেষজ্ঞ বদলে থেকে sqlskills.com/blogs/kimberly/disk-space-is-cheap
হারুন বারট্রান্ড

ওহ, এবং অবশ্যই NEWID () থেকে পৃষ্ঠা বিভাজনগুলি থেকে সাবধান থাকুন
ম্যাক্স ভার্নন

1
আমার বসগুলি কেবল তাদের উচ্চ দেখায় এমন ভিত্তিতে উচ্চ মানের প্রতি আপত্তি জানায়। আমি আশাবাদী যে এই প্রশ্নটি আমাকে আরও সম্ভাব্য আপত্তি দেখিয়ে দেবে, তবে এটি যদি তার অন্যতম প্রধান যুক্তি হয় তবে তিনি সম্ভবত জিইউইডিগুলির প্রতি আরও নেতিবাচক প্রতিক্রিয়া দেখান।
রম্টসচো

1
@ সিরিটসচো আপনার বসকে বলুন যে একটি সারোগেট সংখ্যা কেবল একটি অর্থহীন সংখ্যা (সংখ্যার "আকার" অপ্রাসঙ্গিক) এবং একটি ক্রমের ফাঁকগুলি প্রাকৃতিক এবং মূলত অপরিবর্তনীয়।
অ্যারন বারট্রান্ড

0

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


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

ব্যবহারকারীরা কেন অখণ্ড ক্রম চান?
অনুপস্থিত ক্রম সংখ্যা হ'ল যে কোনও ধরণের অডিটিংয়ে অনাবৃত ত্রুটির সর্বাধিক প্রাথমিক লক্ষণ। এই "বুককিপিং -101" নীতি সর্বব্যাপী। তবে, হাতে থাকা রেকর্ড সংখ্যক রেকর্ডের জন্য যা কাজ করে, ডাটাবেসে খুব বড় সংখ্যক রেকর্ড প্রয়োগ করার সময় একটি গুরুতর সমস্যা হয় ...

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

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