ভারচর এবং এনভারচার এসকিউএল সার্ভার ডেটা ধরণের মধ্যে পারফরম্যান্সের মূল পার্থক্যগুলি কী কী?


236

আমি ব্যবহার আমার স্কুলে একটি ছোট ওয়েব অ্যাপ্লিকেশন জন্য একটি ডাটাবেস কাজ করছি SQL Server 2005। বনাম সম্পর্কিত
ইস্যুতে আমি বেশ কয়েকটি বিদ্যালয় দেখতে পাচ্ছি :varcharnvarchar

  1. ব্যবহারের varcharযদি না আপনি আন্তর্জাতিক তথ্য অনেক সঙ্গে মোকাবিলা, তারপর ব্যবহার nvarchar
  2. শুধু nvarcharসব কিছুর জন্য ব্যবহার করুন ।

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


এখানে অনুরূপ প্রশ্ন: stackoverflow.com/questions/312170/... যা মজার ঠিক বিপরীত সিদ্ধান্তে পৌঁছান Le dorfier দ্বারা সম্পাদনা করুন।
বুজি বয়

6
বিস্তৃত সিদ্ধান্তে এসেছিল যা আরও অনেক বিস্তৃত থ্রেড রেফারেন্স। stackoverflow.com/questions/312170/...
dkretz

2
জেসন: আমি আশা করি এটি অনুপযুক্ত অনুরোধ নয়, তবে আপনি দয়া করে জিবিএন-র গৃহীত উত্তরটি পরিবর্তন করার বিষয়ে বিবেচনা করতে পারেন । জোবারোন এর উত্তর অনেক কারণে ভয়াবহভাবে ভুল। এটি "স্বীকৃত" হওয়ার কারণে নতুন পছন্দগুলি ভুল পছন্দগুলি তৈরি করতে ভ্রান্ত করে। এটি "সর্বদা ব্যবহার করা" অপ্রয়োজনীয় এবং অপব্যয় NVARCHAR, এবং এটি কার্যকারিতা এবং হার্ডওয়্যার ব্যয় / বাজেটের উপর খুব নেতিবাচক প্রভাব ফেলতে পারে। কয়েক সারি, এমনকি কয়েক হাজার, কিছু আসে যায় না। তবে সিস্টেমগুলি লোকেদের প্রত্যাশার চেয়ে আরও দ্রুত বৃদ্ধি পায়, সুতরাং বর্তমানের গৃহীত উত্তরগুলি সম্প্রদায়ের জন্য একটি বিরক্তি। ধন্যবাদ.
সলোমন রুটজকি

উত্তর:


140

সর্বদা nvarchar ব্যবহার করুন।

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

বারচার থেকে এনভারচারে একটি অ্যাপ্লিকেশন স্থানান্তর করার জন্য ব্যয় আপনি বেশিরভাগ অ্যাপ্লিকেশনগুলিতে ব্যবহার করবেন এমন অতিরিক্ত ডিস্কের জায়গার চেয়ে অনেক বেশি হবে।


4
ফিরে যাওয়া এবং বহুভাষিক পাঠ্য / বার্তা, সময় অঞ্চল, পরিমাপের একক এবং মুদ্রার জন্য সমর্থন যুক্ত করা আরও শক্ত, সুতরাং প্রত্যেকে সর্বদা প্রথম দিন থেকে তাদের আবেদনে কোড করা আবশ্যক (এমনকি এটি কেবল আপনার হোম পেজে ওয়েবে থাকলেও অ্যাপ্লিকেশন)!
কেএম

82
সূচকের আকার, স্মৃতি ব্যবহার ইত্যাদি সম্পর্কে কী? আমি ধরে নিয়েছি আপনি যখন সবসময় ইনট ব্যবহার করেন আপনি যখন "টুকিটাকি ক্ষেত্রে" খুব ছোট ব্যবহার করতে পারেন?
gbn

99
সবসময় একটি বহুভাষিক সাইটের জন্য কোডিং / পরিকল্পনা করা (যখন আপনার কোনও কালি না লাগলে এটির প্রয়োজন হবে) সমস্ত তরুণ প্রাপ্তবয়স্ককে বলার মতো তাদের একটি বড় 8 আসন কেনা উচিত, তাদের প্রথম গাড়ির জন্য গ্যাস-গুজল এসইউভি ... সর্বোপরি , তারা কোনও দিন বিয়ে করতে পারে এবং তাদের 6 বাচ্চা থাকতে পারে,। আমি বরং পারফরম্যান্স এবং দক্ষতা উপভোগ করতে পারতাম এবং যখন প্রয়োজন / যখন প্রয়োজন হয় তখন আপগ্রেডের জন্য মূল্য প্রদান করতাম।
ইজে ব্রেন্নান

4
@cbmeeks: আমি না আমি কি কোড না জানি। তবে আপনি যদি এটি কোনও লক্ষণীয় পারফরম্যান্স হিট না করে ব্যবহার করতে পারেন তবে আপনার ডেটাবেসগুলি এটি গুরুত্বপূর্ণ
বিবেচ্য

60
সাধারণত যখন লোকেরা তাদের উত্তর "সর্বদা" শব্দটি দিয়ে শুরু করে তবে তার পরে যা কিছু ঘটে তা আপনার উপেক্ষা করা উচিত। (লক্ষ্য করুন যে আমি "সাধারণ" শব্দটি দিয়ে এই বিবৃতিটি শুরু করেছি :)
ব্র্যান্ডন মুর

226

ডিস্ক স্পেস ইস্যু নয় ... তবে মেমরি এবং পারফরম্যান্স হবে। পৃষ্ঠাটি দ্বিগুণ পড়ে, ডাবল সূচকের আকার, অদ্ভুত পছন্দ এবং = ধ্রুবক আচরণ ইত্যাদি

আপনার কি চাইনিজ ইত্যাদি লিপি সঞ্চয় করতে হবে? হ্যাঁ বা না...

এবং এমএস বিএল থেকে " ইউনিকোডের স্টোরেজ এবং পারফরম্যান্স এফেক্টস "

সম্পাদনা করুন :

নব্যারচর অভিনয় কতটা খারাপ হতে পারে তা হাইলাইট করে সাম্প্রতিক এসও প্রশ্ন ...

এনভিআরচর স্ট্রিংগুলির ভিতরে অনুসন্ধানের সময় এসকিউএল সার্ভার উচ্চ সিপিইউ ব্যবহার করে


19
+1, যদি আপনার অ্যাপ্লিকেশনটি আন্তর্জাতিক হয়, আপনার কাছে উদ্বেগের সাথে আরও অনেক সমস্যা রয়েছে যেটি কোনও অনুসন্ধান / প্রতিস্থাপনের প্রতিস্থাপন করতে হবে: বহুভাষিক পাঠ / বার্তা, সময় অঞ্চল, পরিমাপের একক এবং মুদ্রা
কেএম।

2
তবে আপনার যদি কখনও কখনও জোসে বা জর্জানের মতো কোনও বিদেশী নাম সংরক্ষণ করতে হয় তবে কী হবে?
কিওয়ারটি

7
@ কিওয়ার্টি: তারপরে আপনি এনভারচার ব্যবহার করুন। আপনি যা করবেন না এটি অযথা ব্যবহার করুন। এই 2 নামগুলি
আইআরসি

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

2
@ কোডোমনকি, এট আল: আমি নিম্নলিখিত নিবন্ধে সর্বজনীনভাবে নষ্ট স্থানের সমস্যাটি সমাধান করার জন্য আমি যা করতে পেরেছিলাম তা করেছি: ডিস্ক সস্তা Cheap Orly? (নিখরচায় নিবন্ধকরণ প্রয়োজন)। নিবন্ধটি উদ্দেশ্যহীন, এন্টারপ্রাইজ-স্তরীয় স্টোরেজ সম্পর্কিত কোডমনকি দ্বারা পরিচালিত পরিস্থিতি রোধে সহায়তা করে is
সলোমন রুটজকি

59

অটল থাক! এনভিচার্কার-এ একটি ভ্রচার-এ যোগ দিন একটি দুর্দান্ত পারফরম্যান্স হিট।


115
আপনি যদি চরিত্রের ক্ষেত্রগুলিতে যোগ দিয়ে থাকেন তবে আপনার ডেটাবেজে সম্ভবত এনভারচার বা ভারচর ব্যবহার করা উচিত কিনা তার চেয়ে খারাপ সমস্যা রয়েছে।
ব্র্যান্ডন মুর

@Thomas Harlan একটি সরল পরীক্ষা আমার কাছে প্রমান যোগদান মধ্যে কোন বাস্তব পার্থক্য নেই nvarcharকরার varcharরূপান্তর বনাম nvarcharকরতে varcharএবং যোগদান varchar। অবশ্যই না আপনি বোঝাতে চেয়েছিলেন কলামের ডেটাটাইপগুলিতে ধারাবাহিক হওয়া, যোগদানের ক্ষেত্রে নয়।
আজ

1
@ জেহ এবং থমাস: ১) "সাধারণ" পরীক্ষাগুলি প্রায়শই বিভ্রান্তিকর হয় কারণ এগুলি আচরণের মধ্যে পার্থক্যের কারণগুলির প্রকরণগুলি আবরণ করে না। ২) যদি কেউ মিশ্রণের সময় কঠোর পারফরম্যান্সের হিট দেখে VARCHARএবং NVARCHAR, এটি VARCHARকলামটির সূচীকরণের সাথে সেই কলামের (এবং তাই সূচক) জন্য ব্যবহৃত কোলেশন প্রকারের কারণে হওয়া উচিত । আমি নিম্নলিখিত ব্লগ পোস্টে এই বিষয়টি বিস্তারিতভাবে কভার করছি: ভুচারার এবং এনভিচারার প্রকারগুলি মিশ্রিত করার সময় সূচকগুলিতে প্রভাব
সলোমন রুটজকি

44

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

আমার কাছে একটি কঠোর এবং দ্রুত "সর্বদা nvarchar" নিয়ম থাকবে না কারণ এটি অনেক পরিস্থিতিতে সম্পূর্ণ বর্জ্য হতে পারে - বিশেষত এএসসিআইআই / ইবিসিডিআইসি থেকে ইটিএল বা সনাক্তকারী এবং কোড কলাম যা প্রায়শই কী এবং বিদেশী কী থাকে।

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


26

আমি ইতিমধ্যে এখানে আরও একটি উত্তর যুক্ত করতে সংকোচ করছি কারণ ইতিমধ্যে বেশ কয়েকটি রয়েছে, তবে কয়েকটি পয়েন্ট করা দরকার যা হয় হয় নি বা পরিষ্কারভাবে তৈরি করা হয়নি।

প্রথম: সর্বদা ব্যবহার করবেন নাNVARCHAR । এটি একটি অত্যন্ত বিপজ্জনক এবং প্রায়শই ব্যয়বহুল / দৃষ্টিভঙ্গি / এবং " কার্সারগুলি কখনই ব্যবহার করবেন না " বলা আরও ভাল নয় কারণ এগুলি কখনও কখনও কোনও নির্দিষ্ট সমস্যা সমাধানের সবচেয়ে কার্যকর মাধ্যম এবং WHILEলুপ করার সাধারণ কাজটি প্রায়শই একটি সঠিকভাবে সম্পন্ন কার্সারের চেয়ে ধীর হয়ে যায় ।

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

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

  • লেনদেনের লগ ফাইলের আকার
  • প্রতিলিপি তৈরি করতে সময় লাগে (যদি প্রতিলিপি ব্যবহার করা হয়)
  • ETL এ সময় লাগে (যদি ETLing হয়)
  • কোনও রিমোট সিস্টেমে লগগুলি চালিত করতে এবং পুনরুদ্ধার করতে সময় লাগে (যদি লগ শিপিং ব্যবহার করা হয়)
  • ব্যাকআপ আকার
  • ব্যাকআপটি সম্পূর্ণ করতে সময় লাগে
  • পুনরুদ্ধার করতে সময় লাগবে (এটি কোনও দিন গুরুত্বপূর্ণ হতে পারে ;-)
  • টেম্পডিবির জন্য আকার প্রয়োজন
  • ট্রিগারগুলির কার্য সম্পাদন (tempোকানো এবং মুছে ফেলা টেবিলগুলি যা টেম্পিডবিতে সঞ্চিত থাকে)
  • সারি সংস্করণের সংস্করণ (যদি SNAPSHOT বিচ্ছিন্নতা ব্যবহার করা হয়, যেহেতু সংস্করণ স্টোরটি টেম্পডবিতে রয়েছে)
  • নতুন ডিস্কের স্থান পাওয়ার ক্ষমতা যখন সিএফও বলে যে তারা গত বছর সানটিতে মাত্র ১ মিলিয়ন ডলার ব্যয় করেছে এবং তাই তারা অতিরিক্ত স্টোরেজের জন্য আরও another 250k অনুমোদন করবে না
  • INSERT এবং আপডেট আপডেট করতে সময় লাগে
  • সূচি রক্ষণাবেক্ষণ করতে সময় লাগে
  • ইত্যাদি, ইত্যাদি

নষ্ট স্থানটি পুরো সিস্টেমে একটি বিশাল ক্যাসকেড প্রভাব ফেলে। আমি এই বিষয়ে সুস্পষ্ট বিবরণ নিয়ে একটি নিবন্ধ লিখেছিলাম: ডিস্ক ইজ সস্তা! Orly? (নিখরচায় নিবন্ধকরণ প্রয়োজন; দুঃখিত আমি সেই নীতিটি নিয়ন্ত্রণ করি না)।

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

  • শিক্ষার্থীর এবং / অথবা অনুষদ নামের জন্য ক্ষেত্রসমূহ উচিত সম্ভবত হতে NVARCHAR, যেহেতু সময়ের সাথে, এটি শুধুমাত্র সম্ভাবনা বেশি যে অন্যান্য সংস্কৃতির নাম সে জায়গায় দেখানো হবে হচ্ছে।
  • তবে রাস্তার ঠিকানা এবং শহরের নাম? অ্যাপ্লিকেশনটির উদ্দেশ্য বর্ণিত হয়নি (এটি সহায়ক হতে পারে) তবে ঠিকানার কোনও নির্দিষ্ট ভৌগলিক অঞ্চলে (যেমন একক ভাষা / সংস্কৃতি) এর সাথে সম্পর্কিত, তবে ঠিকানা রেকর্ডগুলি ধরে নিলে VARCHARযথাযথ কোড পৃষ্ঠাটি ব্যবহার করুন (যা ক্ষেত্রের কোলেশন থেকে নির্ধারিত হয়)।
  • যদি রাজ্য এবং / অথবা দেশের ISO কোডগুলি (স্টোর করার কোন প্রয়োজন সংরক্ষণকারী INT/ TINYINTযেহেতু ISO কোডগুলি ঠিক করা হয়েছে দৈর্ঘ্য, মানব পাঠযোগ্য, এবং ভাল, মানক :) ব্যবহার CHAR(2)দুই অক্ষর কোডগুলি এবং CHAR(3)যদি 3 অক্ষর কোড ব্যবহার। এবং যেমন একটি বাইনারি কলেশন ব্যবহার বিবেচনা করুন Latin1_General_100_BIN2
  • যদি পোষ্টাল কোডগুলি (যেমন পিন কোডগুলি) সংরক্ষণ VARCHARকরে থাকে তবে এটি এজেডের বাইরে কোনও অক্ষর কখনও ব্যবহার না করা আন্তর্জাতিক মানের এটি ব্যবহার করুন। এবং হ্যাঁ, এখনও VARCHARকেবল ইউএস জিপ কোডগুলি সংরক্ষণ করে এবং INT না থাকলেও ব্যবহার করুন যেহেতু জিপ কোডগুলি সংখ্যা নয়, সেগুলি স্ট্রিং রয়েছে এবং তাদের মধ্যে কিছুগুলির একটি শীর্ষস্থানীয় "0" রয়েছে। এবং যেমন একটি বাইনারি কলেশন ব্যবহার বিবেচনা করুন Latin1_General_100_BIN2
  • যদি ইমেল ঠিকানা এবং / অথবা ইউআরএল সংরক্ষণ করে তবে NVARCHARসেগুলির দুটিই এখন ইউনিকোড অক্ষর ধারণ করতে পারে।
  • ইত্যাদি

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

  1. আপনি যদি এসকিউএল সার্ভার ২০০৮ - ২০১T আরটিএম ব্যবহার করে থাকেন এবং এন্টারপ্রাইজ সংস্করণে রয়েছেন বা এসকিউএল সার্ভার 2016 এসপি 1 (যা সমস্ত সংস্করণে ডেটা সংক্ষেপণ উপলভ্য করেছে) বা আরও নতুন ব্যবহার করে থাকে তবে আপনি ডেটা সংক্ষেপণ সক্ষম করতে পারেন । ডেটা সংক্ষেপণ ( NCHARএবং "সর্বদা" হবে না) ইউনিকোড ডেটা এবং NVARCHARক্ষেত্রগুলিকে সংকুচিত করতে পারে । নির্ধারণকারী কারণগুলি হ'ল:

    1. NCHAR(1 - 4000)এবং NVARCHAR(1 - 4000)ব্যবহার ইউনিকোড জন্য আদর্শ কম্প্রেশন স্কিম , কিন্তু শুধুমাত্র 2008 R2 হলো, এবং শুধুমাত্র সারির ডেটার জন্য SQL সার্ভার শুরু না ওভারফ্লো! এটি নিয়মিত ROW / PAGE সংক্ষেপণ অ্যালগরিদমের চেয়ে ভাল বলে মনে হয়।
    2. NVARCHAR(MAX)এবং XML(এবং আমিও অনুমান করি এবং VARBINARY(MAX), TEXTএবং NTEXT) যে তথ্য সারি (LOB বা ওভারফ্লু পৃষ্ঠায় সারি বন্ধ নয়) কমপক্ষে পৃষ্ঠা সংকুচিত হতে পারে, তবে ROW সংকুচিত হতে পারে না । অবশ্যই, পৃষ্ঠাগুলি সংক্ষেপণ ইন-সারি মানের আকারের উপর নির্ভর করে: আমি ভিচারার (ম্যাক্স) দিয়ে পরীক্ষা করেছি এবং দেখেছি যে 6000 অক্ষর / বাইট সারিগুলি সংকোচিত করবে না, তবে 4000 অক্ষর / বাইট সারিগুলি করেছে।
    3. যে কোনও অফ রো অফ ডেটা, এলওবি বা ওভারলও = আপনার জন্য কোনও সংকোচনের দরকার নেই!
  2. যদি এসকিউএল সার্ভার 2005 বা 2008 - 2016 আরটিএম ব্যবহার করে এবং এন্টারপ্রাইজ সংস্করণে না হয় তবে আপনার দুটি ক্ষেত্র থাকতে পারে: একটি VARCHARএবং একটি NVARCHAR। উদাহরণস্বরূপ, ধরা যাক আপনি ইউআরএলগুলি সংরক্ষণ করছেন যা বেশিরভাগই সমস্ত বেস ASCII অক্ষর (মান 0 - 127) এবং তাই এর মধ্যে ফিট হয় VARCHARতবে কখনও কখনও ইউনিকোড অক্ষর থাকে। আপনার স্কিমাতে নিম্নলিখিত 3 টি ক্ষেত্র অন্তর্ভুক্ত থাকতে পারে:

      ...
      URLa VARCHAR(2048) NULL,
      URLu NVARCHAR(2048) NULL,
      URL AS (ISNULL(CONVERT(NVARCHAR([URLa])), [URLu])),
      CONSTRAINT [CK_TableName_OneUrlMax] CHECK (
                        ([URLa] IS NOT NULL OR [URLu] IS NOT NULL)
                    AND ([URLa] IS NULL OR [URLu] IS NULL))
    );

    এই মডেলটিতে আপনি কেবল[URL] গণিত কলামটি থেকে নির্বাচন করুন । সন্নিবেশ এবং আপডেট করার জন্য, আপনি কোন ক্ষেত্রটি ব্যবহার করবেন তা দেখে তা নির্ধারণ করে আগত মানটি পরিবর্তিত হয় কিনা, যা NVARCHARটাইপের হতে হবে :

    INSERT INTO TableName (..., URLa, URLu)
    VALUES (...,
            IIF (CONVERT(VARCHAR(2048), @URL) = @URL, @URL, NULL),
            IIF (CONVERT(VARCHAR(2048), @URL) <> @URL, NULL, @URL)
           );
  3. আপনি আগত মানগুলিকে GZIP করতে পারেন VARBINARY(MAX)এবং তারপরে বেরিয়ে যাওয়ার পথে আনজিপ করতে পারেন:

    • এসকিউএল সার্ভার 2005 - 2014 এর জন্য: আপনি এসকিউএলসিএলআর ব্যবহার করতে পারেন। এসকিউএল # (আমি লিখেছি এমন একটি এসকিউএলসিআরআর পাঠাগার) নিখরচায় সংস্করণে Util_GZip এবং Util_GUnzip সহ আসে
    • এসকিউএল সার্ভার ২০১ 2016 এবং আরও নতুনর জন্য: আপনি বিল্ট-ইন COMPRESSএবং DECOMPRESSফাংশনগুলি ব্যবহার করতে পারেন , এটি জি জিপও।
  4. যদি এসকিউএল সার্ভার 2017 বা আরও নতুন ব্যবহার করে থাকে তবে আপনি টেবিলটিকে ক্লাস্টারড কলামস্টোর সূচক তৈরি করতে পারেন।

  5. যদিও এটি এখনও কার্যকর ব্যবহারযোগ্য বিকল্প নয়, এসকিউএল সার্ভার 2019 ইউটিএফ -8 এর জন্য VARCHAR/ CHARডেটাটাইপগুলিতে স্থানীয় সমর্থন প্রবর্তন করে । এটি ব্যবহার করার জন্য এটির সাথে বর্তমানে এটিতে প্রচুর বাগ রয়েছে, তবে সেগুলি স্থির করা থাকলে, কিছু পরিস্থিতিতে এটি একটি বিকল্প । এই নতুন বৈশিষ্ট্যের বিশদ বিশ্লেষণের জন্য দয়া করে আমার পোস্টটি " এসকিউএল সার্ভার 2019-এ নেটিভ ইউটিএফ -8 সমর্থন: ত্রাণকর্তা বা ভুয়া নবী? " দেখুন।


7
ধীর তালি কেবল অবাক হয়েই যে "সর্বদা nvarchar ব্যবহার করুন" 140 টি ভোট পেয়েছিল এবং এটি পায় নি। এই পোস্টে দুর্দান্ত কাজ।
schizoid04

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

22

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

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


10

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


8

সাধারণভাবে বলতে; সর্বাধিক ব্যয়বহুল ডেটাটাইপ দিয়ে শুরু করুন যা সর্বনিম্ন সীমাবদ্ধতা রয়েছে। এটি উত্পাদন করা । যদি পারফরম্যান্সটি কোনও সমস্যা হতে শুরু করে তবে সেই nvarcharকলামগুলিতে আসলে কী সংরক্ষণ করা হচ্ছে তা সন্ধান করুন । সেখানে কি এমন কোনও চরিত্র রয়েছে যা মানায় না varchar? যদি তা না হয় তবে বার্চারে স্যুইচ করুন। ব্যথা কোথায় তা জানার আগে প্রাক-অনুকূলকরণের চেষ্টা করবেন না। আমার অনুমান যে Nvarchar / varchar এর মধ্যে পছন্দটি আপনার ভবিষ্যতে আপনার আবেদনকে ধীর করে দেবে তা নয় । অ্যাপ্লিকেশনটির অন্যান্য অংশগুলি রয়েছে যেখানে পারফরম্যান্স টিউনিং আপনাকে অর্থের জন্য আরও অনেক ধাক্কা দেয়


7

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

বৃহত্তর সূচকগুলি ইত্যাদির থেকে আমি এখনও কার্য সম্পাদন সম্পর্কিত কোনও সমস্যার মুখোমুখি হতে পারি নি etc.

আপনি সঞ্চিত পদ্ধতি ব্যবহার করেন বা ফ্লাইতে এসকিউএল নির্মাণ করুন তা নিশ্চিত করুন যে সমস্ত স্ট্রিং ধ্রুবক N এর সাথে উপসর্গ করা হয়েছে (যেমন SET @foo = N'Hello ওয়ার্ল্ড। ';) তাই ধ্রুবকটিও ইউনিকোড। এটি রানটাইমে কোনও স্ট্রিং ধরণের রূপান্তর এড়ায়।

YMMV।


4
আপনি যে টেবিলগুলির সাথে কাজ করছেন তাতে সম্ভবত আপনার কয়েকশ মিলিয়ন রেকর্ড নেই। আমি সম্মত হই যে বেশিরভাগ অ্যাপ্লিকেশানের জন্য এনভারচরকে ডিফল্ট করা ভাল, তবে সমস্ত কিছু নয়।
ব্র্যান্ডন মুর

7

আমি এই সম্পর্কে অভিজ্ঞতা থেকে কথা বলতে পারেন, সাবধান nvarchar। আপনার একেবারে এটির প্রয়োজন না হলে এই ডেটা ফিল্ডের ধরণটি বৃহত্তর ডাটাবেসের কার্যকারিতা নষ্ট করে। আমি একটি ডাটাবেস উত্তরাধিকার সূত্রে পেয়েছি যা কর্মক্ষমতা এবং স্থানের দিক দিয়ে আঘাত করে hur আমরা একটি 30 জিবি ডাটাবেসটিকে 70% কমাতে সক্ষম করেছিলাম! পারফরম্যান্সে সহায়তা করার জন্য আরও কিছু পরিবর্তন করা হয়েছিল তবে আমি নিশ্চিত যে varcharএর সাথে এটিরও উল্লেখযোগ্যভাবে সাহায্য হয়েছিল। আপনার ডাটাবেসে যদি এক মিলিয়ন + রেকর্ডে টেবিলগুলি বাড়ার সম্ভাবনা থাকে তবে তা কোনও nvarcharখরচ ছাড়াই দূরে থাক ।


4

আমি প্রায়শই এই প্রশ্নের সাথে কাজ করি:

  • ইনভেন্টরি এবং মূল্যের এফটিপি ফিডস - বারচার ভাল কাজ করার সময় আইটেমের বিবরণ এবং অন্যান্য পাঠ্য এনভারচারে ছিল। এগুলিকে ভারচারে রূপান্তর করা ফাইলের আকার হ্রাস করা প্রায় অর্ধেক এবং সত্যিই আপলোডগুলিতে সহায়তা করে।

  • উপরের দৃশ্যটি ঠিকঠাক কাজ করেছিল যতক্ষণ না কেউ আইটেমের বর্ণনায় একটি বিশেষ চরিত্র স্থাপন করে (সম্ভবত ট্রেডমার্ক, মনে করতে পারে না)

আমি এখনও বারবারের উপরে প্রতিবার nvarchar ব্যবহার করি না। বিশেষ চরিত্রগুলির জন্য যদি কোনও সন্দেহ বা সম্ভাবনা থাকে তবে আমি এনভারচার ব্যবহার করি। আমি ক্ষেত্রটি জনবহুল যা 100% এর নিয়ন্ত্রণে থাকি যখন আমি বেশিরভাগ ব্যবহার করি।


3

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

তারপরে আপনি যদি ইউনিকোড সঞ্চয় করতে চান এবং কেবলমাত্র পুরানো এএসসিআইআই-এর সাথে সামঞ্জস্য রাখতে চান তবে আমি ভर्चার () এবং ইউটিএফ -8 ব্যবহার করা ম্যাজিক বুলেট হিসাবে ভাবতে পারি: এটি যখন প্রয়োজন তখন এটি আরও বেশি স্থান ব্যবহার করে।

আপনারা যারা ইউটিএফ -8 এর সাথে অপরিচিত, তাদের জন্য আমি কোনও প্রাইমারের প্রস্তাব দিতে পারি ।


2
আপনি যা পরামর্শ দিচ্ছেন তা কিছু অ্যাপ্লিকেশনের জন্য কার্যকর হতে পারে তবে এসকিউএল পাঠ্য প্রক্রিয়া করার পথে অতিরিক্ত এনকোডিং স্তরটির প্রভাব বিবেচনা করতে হবে। বিশেষত, জোট, অনুসন্ধান এবং প্যাটার্ন মেলানো কার্যকর হবে। এবং যদি রিপোর্টগুলি ডাটাবেসের বিরুদ্ধে চালানো হয় তবে মানক প্রতিবেদনের সরঞ্জামগুলি মাল্টি-বাইট অক্ষরকে সঠিকভাবে হস্তক্ষেপ করবে না। এবং বাল্ক আমদানি এবং রফতানি প্রভাবিত হতে পারে। আমি মনে করি যে the দীর্ঘমেয়াদে — এই স্কিমটি এর মূল্য হিসাবে বেশি সমস্যা হতে পারে।
জেফরি এল হুইলেটজ

1
ইউআরএফএফ -২ ভোরচার কলামগুলিতে সঞ্চয় করা সম্ভব নয়। এমএসএসকিউএল সর্বদা আপনার ইউটিএফ -8 ডেটা কলামের সাথে বদলে যাবে। আপনি যদি কোলেশনটি জগাখিচুড়ি করেন (যেমন ল্যাটিন_1 এ সিপি 1252 সংরক্ষণ করার চেষ্টা করছেন) রূপান্তরটি কার্যকর হবে না এবং আপনি আপনার ডেটাতে অতিরিক্ত বাইট নিয়ে শেষ করবেন। মে প্রদর্শিত কাজ জরিমানা যখন আপনি latin_1 (ডিবি পাশ) এর (অ্যাপ্লিকেশানের দিকে) UTF-8- latin_1 রূপান্তর এবং ফিরে আবার কিন্তু এটি শুধু একটি বিভ্রম। ফ্রেটিডস ব্যবহার করে এবং প্রোটোকলটিকে 7 এরও কম কিছুতে সেট করে আপনি ডিবি অটোকে আপনার কলাম কোলেশনে রূপান্তরিত করতে পারেন, তবে আপনি এনভারচারকে জিজ্ঞাসা করার ক্ষমতা হারাবেন।
চুগাদি

1
@ চুগাদি এবং তেভ্যা: এই উত্তরটি কিছুটা অ-সংজ্ঞাবহ। এসকিউএল সার্ভার ইউনিকোড ডেটা (যেমন এক্সএমএল এবং- Nপ্রিফিক্সড প্রকার) সংরক্ষণ করতে কেবল ইউসিএস -2 / ইউটিএফ -16 ব্যবহার করে । আপনি ইউটিএফ -8 ব্যবহারের পছন্দ পান না। এছাড়াও, ইউনিকোড এনকোডিংগুলি (ইউটিএফ -8, ইউসিএস -2 / ইউটিএফ -16, এবং ইউটিএফ -32) ভ্রচার আর ক্ষেত্রে প্রয়োগ করা যাবে না।
সলোমন রুটজকি

2

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


1

যদি আপনি NVARCHARকেবলমাত্র কোনও সিস্টেম সঞ্চিত পদ্ধতিটির প্রয়োজনের জন্য ব্যবহার করছেন , সর্বাধিক ঘন ঘটনাটি অনিবার্যভাবে হয় sp_executesqlএবং আপনার গতিশীল এসকিউএল খুব দীর্ঘ হয় VARCHARতবে আপনি রূপান্তরকরণের ক্ষেত্রে সমস্ত স্ট্রিং ম্যানিপুলেশন (কনটেনটেশন, প্রতিস্থাপন ইত্যাদি) করছেন পারফরম্যান্সের দৃষ্টিভঙ্গি থেকে আপনি ভাল be NVARCHARপ্রোম প্যারামিটারে শেষ ফলাফল এবং খাওয়ানো। তাই না, সবসময় ব্যবহার করবেন না NVARCHAR!

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