কোনও টেবিলের সংজ্ঞায় কলামগুলির ক্রম কী গুরুত্বপূর্ণ?


35

কোনও সারণিটি সংজ্ঞায়িত করার সময়, লজিকাল গ্রুপগুলিতে কলামগুলি এবং গোষ্ঠীগুলিকে উদ্দেশ্য অনুযায়ী অর্ডার করা সহায়ক helpful একটি সারণীতে কলামগুলির যৌক্তিক ক্রমটি বিকাশকারীকে বোঝায় এবং এটি ভাল শৈলীর একটি উপাদান।

এটা পরিষ্কার।

তবে যা স্পষ্ট নয় তা হ'ল কোনও টেবিলের কলামগুলির যৌক্তিক ক্রমগুলি স্টোরেজ স্তরে তাদের শারীরিক অর্ডারে কোনও প্রভাব ফেলে কিনা, বা যদি এটির অন্য কোনও প্রভাব থাকে যা যত্ন নিতে পারে।

শৈলীতে প্রভাব ছাড়াও, কলামের অর্ডার কি কোনও ব্যাপার?

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

উত্তর:


23

কোনও টেবিলের কলামগুলির যৌক্তিক ক্রমগুলি কী স্টোরেজ স্তরে তাদের শারীরিক অর্ডারে কোনও প্রভাব ফেলে? হ্যাঁ।

এটি গুরুত্বপূর্ণ বা না তা একটি আলাদা সমস্যা যা আমি উত্তর দিতে পারি না (এখনও)।

একটি রেকর্ডের শারীরবৃত্তির বিষয়ে পল র্যান্ডাল থেকে ঘন ঘন সংযুক্ত নিবন্ধে বর্ণিত অনুরূপভাবে , আসুন আমরা ডিবিসিসি আইএনডি সহ একটি সাধারণ দুটি কলামের টেবিলটি দেখি:

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;

USE master;
GO

IF DATABASEPROPERTY (N'RowStructure', 'Version') > 0 DROP DATABASE RowStructure;
GO

CREATE DATABASE RowStructure;
GO

USE RowStructure;
GO

CREATE TABLE FixedLengthOrder
(
    c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , c2 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL
    , c3 CHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL  
);
GO

INSERT FixedLengthOrder DEFAULT VALUES;
GO

DBCC IND ('RowStructure', 'FixedLengthOrder', 1);
GO

ডিবিসিসি আইএনডি আউটপুট

উপরের আউটপুটটি দেখায় যে আমাদের 89 পৃষ্ঠাটি দেখতে হবে:

DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO

ডিবিসিসি পৃষ্ঠা থেকে আউটপুটে আমরা দেখতে পাই যে সি 2 এর 'বি' এর আগে 'এ' অক্ষরটি দিয়ে সি 1 টি স্টাফ করা হয়েছিল:

Memory Dump @0x000000000D25A060

0000000000000000:   10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010:   41414242 42424242 42424242 030000††††AABBBBBBBBBB...

এবং ঠিক এই কারণেই, RowStructure.mdfএকটি হেক্স সম্পাদক সম্পাদকের সাথে আবক্ষ্ণতা খুলুন এবং 'এ' স্ট্রিংটি 'বি' স্ট্রিংয়ের আগে নিশ্চিত করুন:

AAAAAAAAAA

এখন পরীক্ষার পুনরাবৃত্তি করুন তবে স্ট্রিংয়ের ক্রমটি বিপরীত করুন, সি -1 এ 'বি' অক্ষর এবং সি 2-এ 'ক' অক্ষর রেখে:

CREATE TABLE FixedLengthOrder
(
    c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , c2 CHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL
    , c3 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL  
);
GO

এবার আমাদের ডিবিসিসি PAGE আউটপুটটি আলাদা এবং 'বি' স্ট্রিংটি প্রথম প্রদর্শিত হবে:

Memory Dump @0x000000000FC2A060

0000000000000000:   10001c00 01000000 42424242 42424242 †........BBBBBBBB 
0000000000000010:   42424141 41414141 41414141 030000††††BBAAAAAAAAAA... 

আবার, কেবল গিগলসের জন্য, ডেটা ফাইলের হেক্স ডাম্প পরীক্ষা করতে দিন:

BBBBBBBBBB

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

CREATE TABLE FixedAndVariableColumns
(
    c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
    , c2 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL
    , c3 VARCHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL  
    , c4 CHAR(10) DEFAULT REPLICATE('C', 10) NOT NULL
    , c5 VARCHAR(10) DEFAULT REPLICATE('D', 10) NOT NULL
    , c6 CHAR(10) DEFAULT REPLICATE('E', 10) NOT NULL  
);
GO

Memory Dump @0x000000000E07C060

0000000000000000:   30002600 01000000 41414141 41414141 0.&.....AAAAAAAA 
0000000000000010:   41414343 43434343 43434343 45454545 AACCCCCCCCCCEEEE 
0000000000000020:   45454545 45450600 00020039 00430042 EEEEEE.....9.C.B 
0000000000000030:   42424242 42424242 42444444 44444444 BBBBBBBBBDDDDDDD 
0000000000000040:   444444†††††††††††††††††††††††††††††††DDD

আরো দেখুন:

কলামের অর্ডার কিছু যায় আসে না ... সাধারণত, তবে - এটি নির্ভর করে!


+1 আমি সম্মত আমি সর্বদা খুঁজে পেয়েছি যে প্রতিটি বিভাগের মধ্যেই কলামগুলির ক্রমানুসারে প্রাথমিকভাবে CREATE TABLEবিবৃতি অনুসারে হয় (বাদে সিআই কী কলামগুলি বিভাগে প্রথম আসে)। ALTER COLUMNডেটাটাইপস / কলাম দৈর্ঘ্যের পরিবর্তন হলে কলামগুলির ক্রম পরিবর্তন হতে পারে। কেবলমাত্র ছোটখাটো ক্ষেত্রে যেখানে আমি এটি ভাবতে পারি তা হ'ল খালি স্ট্রিং বা NULL সহ পরিবর্তনশীল দৈর্ঘ্যের বিভাগের শেষে থাকা কলামগুলি কলাম অফসেট অ্যারেতে কোনও স্থান নেয় না (২০০৮ এর ইন্টার্নাল বইয়ে ক্যালেন ডেলানির দ্বারা প্রদর্শিত)
মার্টিন স্মিথ

1
কলাম ক্রম বিরল কোণে ক্ষেত্রে গুরুত্বপূর্ণ হতে পারে। উদাহরণস্বরূপ, আপনার যদি 3 টি কলাম এ, বি এবং সি সহ একটি টেবিল থাকে তবে প্রতি 3 কেবি বাইট দীর্ঘ হয়। এসকিউএল সার্ভার পৃষ্ঠাগুলি 8kb, তাই Cফিট করে না এবং এটি নিজস্ব বর্ধিত পৃষ্ঠায় যায়। সুতরাং আপনার select A, Bটেবিল থেকে কেবলমাত্র অর্ধেক পৃষ্ঠা পড়তে হবে select A, C from YourTable
Andomar

"Whether it matters or not is a different issue that I can't answer (yet).": কলামগুলির ক্রমটি পারফরম্যান্সকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে oreএছাড়াও এটি ত্রুটিগুলিকেও প্রভাবিত করতে পারে! এটি দেখুন - ডেমো 2 এটি আমার মনে হয় আরও ভাল দেখায়
রোনেন অ্যারিলি

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

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

7

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

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

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

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


2

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


1

তুমি যা বলতে চাচ্ছ তা আমি পেয়েছি ডিজাইনের দৃষ্টিকোণ থেকে একটি টেবিল যা দেখতে দেখতে:

**EMPLOYEES**
EmployeeID
FirstName
LastName
Birthday
SSN 

দেখতে এমন কোনও টেবিলের চেয়ে এটি অনেক ভাল:

**EMPLOYEES**
LastName
EmployeeID
SSN 
Birthday
FirstName

তবে আপনি যদি এই জাতীয় কোনও tsql ইস্যু করেন তবে ডেটাবেস ইঞ্জিনটি আপনার লজিকাল কলাম অর্ডারটি সম্পর্কে সত্যই চিন্তা করে না:

SELECT FirstName, LastName, SSN FROM Employees

ইঞ্জিনটি কেবল জানে যে ডিস্কে ফার্স্টনামের তালিকা কোথায় রয়েছে।

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