বর্ণচর (255) বা বর্ণচর (256)?


21

আমি ব্যবহার করা উচিত varchar(255)বা varchar(256)যখন টেবিল নকশা? শুনেছি কলামের দৈর্ঘ্যের জন্য বা মেটাডেটা সঞ্চয় করতে একটি বাইট ব্যবহার করা হয়।

এই মুহুর্তে এটি আর কি গুরুত্বপূর্ণ?

আমি ইন্টারনেটে কিছু পোস্ট দেখেছি, তবে সেগুলি ওরাকল এবং মাইএসকিউএল-এ প্রয়োগ হয়।

আমাদের মাইক্রোসফ্ট এসকিউএল সার্ভার 2016 এন্টারপ্রাইজ সংস্করণ রয়েছে, এটি এই পরিবেশে কীভাবে প্রযোজ্য?

এখন উদাহরণস্বরূপ বলুন, আমি যদি আমার ক্লায়েন্টদের উদাহরণস্বরূপ রাখতে বলি, 256 এর পরিবর্তে 255 অক্ষরের একটি পাঠ্য বিবরণ, সেখানে কি কোনও পার্থক্য রয়েছে? আমি যা পড়েছি "সর্বাধিক 255 অক্ষরের দৈর্ঘ্যের সাথে, ডিবিএমএস ক্ষেত্রের ডেটার দৈর্ঘ্য নির্দেশ করতে একটি একক বাইট ব্যবহার করতে বেছে নিতে পারে the সীমাটি 256 বা তার বেশি হলে দুটি বাইটের প্রয়োজন হত।" এটা কি সত্য?


এফওয়াইআই: এই প্রশ্নটি এমএসডিএন ফোরামগুলিতে ক্রস পোস্ট করা হয়েছিল: সোস্যাল.এমএসএনএন.মাইক্রোসফট
সলোমন রুটজকি

উত্তর:


36

আকার প্রতিটি কলামের উপযুক্তভাবে। প্রতিটি কলামের জন্য "মানক" আকার ব্যবহার করবেন না। আপনার যদি কেবল 30 টি অক্ষর প্রয়োজন হয় তবে কেন একটি কলাম তৈরি করুন যা 255 পরিচালনা করতে পারে? আমি খুব খুশি যে আপনি varchar(max)আপনার স্ট্রিং কলামগুলির জন্য ব্যবহারের পক্ষে পরামর্শ দিচ্ছেন না ।

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

কলামগুলিতে সূচকগুলি যা বড় আকারের হয় তার ফলস্বরূপ ত্রুটি তৈরি হতে পারে:

CREATE TABLE dbo.WideIndex
(
    col1 varchar(255) NOT NULL
    , col2 varchar(255) NOT NULL
    , col3 varchar(600) NOT NULL    
);

CREATE INDEX IX_WideIndex_01
ON dbo.WideIndex (col1, col2, col3);

উপরোক্ত সূচি তৈরির চেষ্টা এই সতর্কবার্তার ফলাফল:

সতর্কবাণী! সর্বাধিক কী দৈর্ঘ্য 900 বাইট। 'IX_ widesIndex_01' সূচকের সর্বোচ্চ দৈর্ঘ্য 1110 বাইট রয়েছে। কিছু বড় মানগুলির সংমিশ্রণের জন্য, সন্নিবেশ / আপডেট ক্রিয়াকলাপটি ব্যর্থ হবে।

ক্লাস্টারড ইনডেক্সের জন্য 900 বাইট সর্বাধিক কী আকার (এবং এসকিউএল সার্ভার 2012 এবং তার চেয়ে বেশি পুরানো) এসকিউএল সার্ভারের নতুন সংস্করণে ক্লাস্টারবিহীন সূচকের জন্য 1700 বাইট সর্বাধিক কী আকার। আপনি যদি জেনেরিক প্রস্থ সহ কলামগুলি ডিজাইন করেন (যেমন 255) তবে আপনি প্রত্যাশার চেয়ে অনেক বার এই সতর্কতাটি চালাতে পারেন।

আপনি যদি স্টোরেজ ইন্টার্নালগুলিতে আগ্রহী হন তবে এসকিউএল সার্ভার কীভাবে সঙ্কলিত সারি-স্টোরের ডেটা সঞ্চয় করে তা আরও ভাল করে বুঝতে আপনি নীচের ছোট পরীক্ষাটি ব্যবহার করতে পারেন।

প্রথমত, আমরা একটি টেবিল তৈরি করব যেখানে আমরা বিভিন্ন আকারের কলামগুলি সঞ্চয় করতে পারি:

IF OBJECT_ID(N'dbo.varchartest', N'U') IS NOT NULL
DROP TABLE dbo.varchartest;
GO

CREATE TABLE dbo.varchartest
(
    varchar30 varchar(30) NOT NULL
    , varchar255 varchar(255) NOT NULL
    , varchar256 varchar(256) NOT NULL
);

এখন আমরা একটি একক সারি সন্নিবেশ করবো:

INSERT INTO dbo.varchartest (varchar30, varchar255, varchar256)
VALUES (REPLICATE('1', 30), REPLICATE('2', 255), REPLICATE('3', 256));

এই ক্যোয়ারীটি অননুমোদিত, এবং অসমর্থিত, ফাংশন sys.fn_RowDumpCrackerএবং sys.fn_PhyslocCrackerটেবিল সম্পর্কে কিছু আকর্ষণীয় বিশদ দেখানোর জন্য ব্যবহার করে :

SELECT rdc.*
    , plc.*
FROM dbo.varchartest vct
CROSS APPLY  sys.fn_RowDumpCracker(%%rowdump%%) rdc
CROSS APPLY sys.fn_physlocCracker(%%physloc%%) plc

আউটপুট এটির মতো দেখাবে:

╔═════════════════════╦════════════╦═════════╦════ ══════╦══════════════════════════╦══════════╦═════ ════════╦═════════════╦═════════╦═════════╦═══════ ══╗
║ পার্টিশন_আইডি ║ কোলনাম ║ আইসিন্রো ║ ইস্পার্সে ║ ইসরেকর্ডপ্রফিক্স সংক্ষেপিত ║ ইসসাম্বল ║ প্রিফিক্সবাইটস ║ ইনরওলেন্থ ║ ফাইল_আইডি ║ পৃষ্ঠা_আইডি ║ স্লট_আইডি ║
╠═════════════════════╬════════════╬═════════╬════ ══════╬══════════════════════════╬══════════╬═════ ════════╬═════════════╬═════════╬═════════╬═══════ ══╣
║ 1729382263096344576 ║ ভারচার 30 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 30 ║ 1 ║ 1912 ║ 0 ║
║ 1729382263096344576 ║ ভারচর 255 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 255 ║ 1 ║ 1912 ║ 0 ║
║ 1729382263096344576 ║ varchar256 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 256 ║ 1 ║ 1912 ║ 0 ║
╚═════════════════════╩════════════╩═════════╩════ ══════╩══════════════════════════╩══════════╩═════ ════════╩═════════════╩═════════╩═════════╩═══════ ══╝

যেমন আপনি দেখতে পাচ্ছেন, InRowLengthপ্রতিটি সারির দৈহিক সঞ্চয় স্থান - "ফাইল_আইডি", "পৃষ্ঠা_আইডি", এবং "স্লট_আইডি" সহ প্রতিটি মানটির জন্য প্রদর্শিত হয়।

যদি আমরা উপরের ক্যোয়ারির ফলাফলগুলি থেকে মানগুলি file_idএবং page_idমানগুলি নিয়ে নিই এবং DBCC PAGEসেগুলি সাথে চালাই তবে আমরা প্রকৃত দৈহিক পৃষ্ঠার সামগ্রীগুলি দেখতে পাই:

DBCC TRACEON (3604); --send display to the client
DBCC PAGE (tempdb, 1, 1912, 3); --database, file_id, page_id, 3 to show page contents
DBCC TRACEOFF (3604);--reset display back to the error log

আমার মেশিনের ফলাফলগুলি হ'ল:

পৃষ্ঠা: (1: 1912)


বাফার:


BUF @ 0x00000000FF5B2E80

বিপেজ = 0x0000000024130000 bhash = 0x0000000000000000 বিপেজেনো = (1: 1912)
বিডিবিড = 2 বিভাজন = 0 বিসিপুটিক্স = 0
bsampleCount = 0 bUse1 = 32497 bstat = 0x10b
ব্লগ = 0x212121cc বেনেক্সট = 0x0000000000000000          

পেজের উপরের অংশ:


পৃষ্ঠা @ 0x0000000024130000

m_pageId = (1: 1912) m_headerVersion = 1 মি_ টাইপ = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 98834 m_indexId (AllocUnitId.idInd) = 7936
মেটাডেটা: AllocUnitId = 2233785421652951040                              
মেটাডেটা: পার্টিশনআইডি = 1945555045333008384 মেটাডেটা: সূচিপত্র = 0
মেটাডেটা: অবজেক্টআইডি = 34099162 মি_প্রিভ পেজ = (0: 0) মি_নেস্টপেজ = (0: 0)
পিনম্লেন = 4 মি_স্লটসিএনটি = 1 মি_ফ্রিসিএনটি = 7538
মি_ফ্রিডাটা = 652 মি_ রিজার্ভড সিএনটি = 0 এম_এলএসএন = (35: 210971: 362)
m_xactRe محفوظ = 0 মি_এক্সডিড আইডি = (0: 0) এম_ঘোস্টআরসিএনটি = 0
m_tornBits = 0 ডিবি ফ্রেগ আইডি = 1                      

বরাদ্দ স্থিতি

গ্যাম (১: ২) = অ্যালকোটেড এসজিএএম (১: 3) = অলকৃত পিএফএস (1: 1) = 0x41 এলকৃত 50_PCT_FULL
ডিআইএফএফ (১:)) = পরিবর্তিত এমএল (১:)) = নয় মেটলোগড           

স্লট 0 অফসেট 0x60 দৈর্ঘ্য 556

রেকর্ডের প্রকার = PRIMARY_RECORD রেকর্ড বৈশিষ্ট্য = NULL_BITMAP VARIABLE_COLUMNS
রেকর্ড আকার = 556                   
মেমরি ডাম্প @ 0x000000005145A060

0000000000000000: 30000400 03000003 002d002c 012c0231 31313131 0 ........-।,।, 11111
0000000000000014: 31313131 31313131 31313131 31313131 31313131 1111111111111111111111
0000000000000028: 31313131 31323232 32323232 32323232 32323232 11111222222222222222
000000000000003C: 32323232 32323232 32323232 32323232 32323232 222222222222222222
0000000000000050: 32323232 32323232 32323232 32323232 32323232 222222222222222222
0000000000000064: 32323232 32323232 32323232 32323232 32323232 222222222222222222
0000000000000078: 32323232 32323232 32323232 32323232 32323232 222222222222222222
000000000000008C: 32323232 32323232 32323232 32323232 32323232 222222222222222222
00000000000000A0: 32323232 32323232 32323232 32323232 32323232 222222222222222222
00000000000000B4: 32323232 32323232 32323232 32323232 32323232 222222222222222222
00000000000000C8: 32323232 32323232 32323232 32323232 32323232 222222222222222222
00000000000000 ডিডিসি: 32323232 32323232 32323232 32323232 32323232 222222222222222222
00000000000000F0: 32323232 32323232 32323232 32323232 32323232 222222222222222222
0000000000000104: 32323232 32323232 32323232 32323232 32323232 222222222222222222
0000000000000118: 32323232 32323232 32323232 32323232 32323232 222222222222222222
000000000000012C: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
0000000000000140: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000000154: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
0000000000000168: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
000000000000017C: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
0000000000000190: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000001A4: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000001B8: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000001CC: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000001E0: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
00000000000001F4: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
0000000000000208: 33333333 33333333 33333333 33333333 33333333 33333333333333333333
000000000000021C: 33333333 33333333 33333333 33333333 3333333333333333

স্লট 0 কলাম 1 অফসেট 0xf দৈর্ঘ্য 30 দৈর্ঘ্য (শারীরিক) 30

varchar30 = 1111111111111111111111111111111111                               

স্লট 0 কলাম 2 অফসেট 0x2d দৈর্ঘ্য 255 দৈর্ঘ্য (শারীরিক) 255

varchar255 = 222222222222222222222222222222222222222222222222222222222222222222222222222222222222
22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
222222222222222222222222222222222222222222                               

স্লট 0 কলাম 3 অফসেট 0x12c দৈর্ঘ্য 256 দৈর্ঘ্য (শারীরিক) 256

ভারচর 256 = 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333                              

16

অন্যরা ইতিমধ্যে চিহ্নিত করেছেন যে দৈর্ঘ্য সংরক্ষণের জন্য প্রয়োজনীয় বাইটের সংখ্যাটি নির্দিষ্ট। আমি আপনার প্রশ্নের এই অংশে ফোকাস করতে চেয়েছিলেন:

এই মুহুর্তে এটি আর কি গুরুত্বপূর্ণ?

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

DROP TABLE IF EXISTS dbo.V255_FULL;

CREATE TABLE dbo.V255_FULL (
    ID1 BIGINT NOT NULL,
    ID2 BIGINT NOT NULL,
    V255 VARCHAR(255)
);

INSERT INTO dbo.V255_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 255)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

EXEC sp_spaceused 'V255_FULL';

ফলাফল:

╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
   name             rows          reserved     data     index_size  unused 
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
 V255_FULL  500000                143176 KB  142888 KB  8 KB        280 KB 
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝

সম্পূর্ণ ভরাট VARCHAR(256)কলাম সহ দ্বিতীয় সারণী তৈরি করা যাক । এটি সারিতে প্রতি কমপক্ষে আরও একটি বাইট নিতে চলেছে, তাই না?

DROP TABLE IF EXISTS dbo.V256_FULL;

CREATE TABLE dbo.V256_FULL (
    ID1 BIGINT NOT NULL,
    ID2 BIGINT NOT NULL,
    V256 VARCHAR(256)
);

INSERT INTO dbo.V256_FULL WITH (TABLOCK)
SELECT TOP (500000) 0, 0, REPLICATE('A', 256)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

EXEC sp_spaceused 'V256_FULL';

ফলাফল:

╔═══════════╦══════════════════════╦═══════════╦═══════════╦════════════╦════════╗
   name             rows          reserved     data     index_size  unused 
╠═══════════╬══════════════════════╬═══════════╬═══════════╬════════════╬════════╣
 V256_FULL  500000                143176 KB  142888 KB  8 KB        280 KB 
╚═══════════╩══════════════════════╩═══════════╩═══════════╩════════════╩════════╝

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


7

ভারচারের ঘোষিত আকারের কোনও কার্যকারিতা প্রভাব নেই। ডেটাটি পৃষ্ঠা সংক্ষেপণ বা সারি সংক্ষেপণের সাথে একটি সারি স্টোর হিসাবে সংরক্ষণ করা যেতে পারে। একটি ক্লাস্টার্ড কলাম স্টোর হিসাবে, বা একটি মেমরি-অনুকূলিত টেবিল হিসাবে। এগুলির প্রত্যেকের আলাদা আলাদা পারফরম্যান্স ট্রেড-অফ রয়েছে, তবে আপনি কোনও ভার্চার (255) বা ভার্চার (256) ঘোষিত কিনা তা বিবেচ্য নয়।


9
@ ডেভিডব্রাউন-মাইক্রোসফ্ট নং, "বর্ণের আকারের ঘোষিত আকারের কোনও কার্যকারিতা প্রভাব নেই" অবশ্যই সত্য নয় - ডেটাটাইপ আকার প্রশ্নের জন্য মেমরি অনুদানকে প্রভাবিত করে। আরও তথ্যের জন্য brentozar.com/archive/2017/02/mmory-grants-data-size দেখুন ।
ব্রেন্ট ওজার

6
এটি সহজ রাখার চেষ্টা করছে, এবং অকাল অপ্টিমাইজেশনকে নিরুৎসাহিত করবে।
ডেভিড ব্রাউন - মাইক্রোসফ্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.