এসকিউএল সার্ভার দশমিক (9, 0) বনাম INT


15

আমাদের গ্রাহকরা DECIMAL(18,0)তার এসকিউএল সার্ভার ২০০৮ আর ২ ডাটাবেসে কিছু কলামের ডেটাটাইপ ব্যবহার করেন। কলামগুলি বেশ ধীরে ধীরে বাড়ার কারণে, তিনি সম্প্রতি DECIMAL(5,0)কিছু স্টোরেজ ফিরে পেতে ডেটাটাইপ পরিবর্তন করার প্রস্তাব করেছিলেন ।

এমএসডিএন লাইব্রেরি অনুসারে , DECIMAL(5,0)ডেটাটাইপের স্টোরেজ স্পেসটি হ'ল DECIMAL(9,0)ডেটাটাইপ, 5 বাইটের মতো। INT1 বাইট ছোট, তবে -99,999 থেকে 99,999 এর পরিবর্তে -2 ^ 31 থেকে 2 ^ 31 এর মধ্যে সব DECIMAL(5,0)কিছু সঞ্চয় করতে পারে যা সঞ্চয় করতে পারে। এমনকি বৃহত্তম DECIMALযা 5 বাইটের সাথে ফিট করে ( DECIMAL(9,0)) কেবলমাত্র 9999,999,999 থেকে 999,999,999 (যা INT4 বাইটে রেঞ্জের অফারের অর্ধেকেরও কম) সীমাতে পূর্ণসংখ্যা সংরক্ষণ করতে পারে ।

আমি DECIMALওভার ব্যবহারের দুটি "সুবিধা" সম্পর্কে ভাবতে পারি INT:

  • পরে আরও স্টোরেজ স্পেস ব্যবহার না করে স্কেল যুক্ত করার ক্ষমতা
  • ডেটা ধরণের পরিবর্তন না করে 38 ডিগ্রি পর্যন্ত নির্ভুলতা স্কেল করার ক্ষমতা

তবে এগুলি আমার মতে আসল সুবিধা নয়:

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

এটি আমাকে অবাক করে তোলে: DECIMAL(5,0)পূর্ণসংখ্যার জন্য ডেটাটাইপের যুক্ত সুবিধা কী?


1
একটি সুবিধা পাঁচ অঙ্কের সীমা হতে পারে। তবে আমি অবাক হয়েছি যে এই ধরণের পরিবর্তনের সাথে আপনি কত সঞ্চয় স্থান রেখে যেতে পারেন।
dezso

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

3
যদি তারা স্টোরেজ স্পেস সম্পর্কে চিন্তিত হয় তবে তারা এর চেয়ে কমপ্রেশন ব্যবহার করে আরও উপযুক্ত। ইন্ট / বিগিন্টের পরিবর্তে দশমিক (x, 0) ব্যবহার করার মতো কোনও স্পষ্ট লাভ নেই।
রবার্ট এল ডেভিস

7
decimal(x,0)এবং একটি পূর্ণসংখ্যার প্রকারের মধ্যে আর একটি পার্থক্য গাণিতিক বিভাগে নিজেকে দেখায়। আপনি যদি কোন int দ্বারা কোনও int ভাগ করেন তবে আপনি একটি int পাবেন। যদি আপনি কোনও দশমিক (x, 0) কে কোনও int দিয়ে ভাগ করেন তবে আপনি একটি দশমিক (x + 6,6) পান।
অ্যান্ড্রি এম

@ অ্যান্ড্রিএম, আমি মনে করি এটি সবচেয়ে বেশি সুবিধা। এটিকে কোনও মন্তব্যের পরিবর্তে একটি উত্তরে পুনরায় রঙ করুন এবং আমি এটিকে উত্তর হিসাবে চিহ্নিত করব।
vstrien

উত্তর:


8

আমি সম্মত হলাম যতক্ষণ না আপনি ডেসিমাল (9, 0) বনাম আইএনটি বা ডেসিমাল (18, 0) বনাম বিজিআইএনটির তুলনা করছেন ততক্ষণ স্টোরেজ স্পেসের ক্ষেত্রে কোনও আসল সুবিধা নেই । (একক বাইটের মধ্যে।)

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

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


আপনার উত্তরটি উপলব্ধি করে তবে একটি প্রসেসরের ডেটাটাইপগুলির কোনও জ্ঞান নেই have সুতরাং 4 বাইটের একটি ডেটাটাইপ, 4 বাইটের অন্য ডেটাটাইপের সাথে তত দ্রুত তুলনা করা হয়। আপনি কি (উদাহরণস্বরূপ পুনরাবৃত্তযোগ্য পারফরম্যান্স পরীক্ষার সাথে) দেখাতে পারেন যে এর DECIMAL(9, 0)পরিবর্তে ব্যবহারের ক্ষেত্রে পারফরম্যান্স হিট হয়েছে INT?
vstrien

2
আমি ভেবেছিলাম আমি পারব, তবে আমি স্বীকার করব যে আমার পরীক্ষাগুলি অন্তর্ভুক্ত নয়। পূর্ণসংখ্যার গণিতে সমস্যা কমাতে সম্ভবত এসকিউএল একটি অপ্টিমাইজেশন করছে। আমার টেস্টবেড: `- এর তুলনা @ স্টার্টটাইম = সিজডেটটাইম সেট করুন () যখন (@ কাউন্টারিন্ট <@ সাইজেন্ট) সেট @ কাউন্টারিন্ট = @ প্রিন্ট 'আইএনটি নিয়েছে' + কনভার্ট (ভারচার (20), ডেটেডিএফ, মিল্টসেকেন্ড, @ স্টার্ট , SYSDATETIME ()) + 'মিলিসেকেন্ডস' - ডেসিমেল সেট @ স্টার্টটাইম = সিএসডিটেটটাইম () WHLE (@ কাউন্টারডেক <@ সাইজডেক) সেট @ কাউন্টারডিইসি = @ কাউন্টারডেক + 1 প্রিন্ট 'ডিসিইসি' + কনভার্ট (20), ডিআরটি (মিলিসেকেন্ড, @ স্টার্টটাইম, SYSDATETIME ())) + 'মিলিসেকেন্ড' `
ক্রিস চুব

আমি মনে করি এসকিউএল সার্ভার সত্যিই সেখানে কিছু অনুকূল করে। অপ্টিমাইজেশন সত্ত্বেও DECIMALএখনও সাধারণত কিছুটা বেশি সময় লাগে (কমপক্ষে আমার বিকাশের সিস্টেমে)। প্রায় 51 এমএস ডিইসি বনাম 46 এমএস আইএনটি প্রায় 10 টি পরীক্ষার দৌড়ে।
vstrien

2

দেখে মনে হচ্ছে স্টোরেজ স্পেসের ক্ষেত্রে কোনও সুবিধা হবে না

আপনি যদি ক্লায়েন্টকে উদ্বিগ্ন থাকেন যে আপনার মানগুলি 2 ^ 32-1 (সর্বাধিক ধনাত্মক মান পূর্ণসংখ্যা সংরক্ষণ করতে পারে) এর চেয়ে বড় হবে তবে আপনাকে বিগইন্টে স্থানান্তরিত হওয়া বিবেচনা করা উচিত - যার সাথে 64 বিট ( 8 বাইট) রয়েছে

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