क्या किसी तालिका में स्तंभों के तार्किक क्रम का भंडारण स्तर पर उनके भौतिक क्रम पर कोई प्रभाव पड़ता है? हाँ।
यह मायने रखता है या नहीं यह एक अलग मुद्दा है जिसका मैं जवाब नहीं दे सकता (अभी तक)।
एक रिकॉर्ड की शारीरिक रचना पर पॉल रैंडल से अक्सर जुड़े लेख में वर्णित इसी तरह से , आइए DBCC IND के साथ एक सरल दो कॉलम तालिका देखें:
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
DBCC पृष्ठ से आउटपुट में हम c1 को c2 के 'B' से पहले 'A' अक्षर से भरते हुए देखते हैं:
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
और सिर्फ इसलिए, RowStructure.mdf
एक हेक्स संपादक के साथ बस्ट को खोलने और 'ए' स्ट्रिंग की पुष्टि 'बी' स्ट्रिंग की पुष्टि करता है:
अब परीक्षण दोहराएं लेकिन स्ट्रिंग्स के क्रम को उलट दें, c1 में 'B' अक्षर और c2 में 'A' अक्षर रखें:
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
इस बार हमारा DBCC पेज आउटपुट अलग है और 'B' स्ट्रिंग पहले दिखाई देता है:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
फिर से, केवल गिगल्स के लिए, डेटा फ़ाइल के हेक्स डंप की जांच करें:
जैसा कि एक रिकॉर्ड की एनाटॉमी बताती है, एक रिकॉर्ड की निश्चित और चर लंबाई के कॉलम अलग-अलग ब्लॉकों में संग्रहीत किए जाते हैं। लॉजिकल रूप से इंटरलेयिंग फिक्स्ड और वेरिएबल कॉलम टाइप का फिजिकल रिकॉर्ड पर कोई असर नहीं पड़ता है। हालाँकि, प्रत्येक ब्लॉक के भीतर आपके कॉलम का क्रम डेटा फ़ाइल में बाइट्स के क्रम में मैप करता है।
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
यह भी देखें:
कॉलम ऑर्डर कोई फर्क नहीं पड़ता ... आम तौर पर, लेकिन - आईटी डिपेंडेंट!
CREATE TABLE
कथन के अनुसार होता है (सिवाय इसके कि सीआई प्रमुख कॉलम पहले सेक्शन में आते हैं)। यदिALTER COLUMN
डेटाटाइप्स / कॉलम की लंबाई बदलती है, तो कॉलम का क्रम बदल सकता है । एकमात्र मामूली मामला जहां यह मायने रखता है कि मैं सोच सकता हूं कि रिक्त स्ट्रिंग या NULL के साथ चर लंबाई अनुभाग के अंत में कॉलम कॉलम ऑफसेट सरणी (2008 में इंटर्नल बुक में केलेन डेलानी द्वारा प्रदर्शित) में बिल्कुल भी जगह नहीं लेता है