मैं कई मंचों पर और कई ब्लॉगों पर पढ़ना जारी रखता हूं जिनमें एक पृष्ठ नीचे दिखाया गया है: पृष्ठ का आकार: 16 x 512B = 8192B पृष्ठ का शीर्ष: = 96B अधिकतम In_Row पंक्ति: = 8060B
यह पत्तियों (8192 - 96 - 8060) बी = 36 बी।
ठीक है, यह तार्किक और सही है। मेरे पास यह प्रश्न है: इतने सारे लोग क्यों कहते हैं कि शेष 36 बी स्लॉट सरणी के लिए आरक्षित है?
जाहिर है, स्लॉट सरणी पेज पर 2 बी प्रति पंक्ति देता है; इसलिए, यह 2B जितना छोटा हो सकता है और 1472B जितना बड़ा हो सकता है:
2 बी: 1 पंक्ति * 2 बी = 2 बी
1472B: 8096B = n * 9B (ओवरहेड के साथ न्यूनतम पंक्ति का आकार ... एकल बिंदु स्तंभ के बारे में सोचें) + n * 2B (प्रति पंक्ति स्लॉट लागत) => 8096 = 11n => n = 8096/11/736।
736 * 2 बी = 1472 बी।
यह मुझे 14B संस्करण टैग के कारण 20 में मिलता है।
USE master ;
GO
CREATE DATABASE test ;
GO
USE test ;
GO
ALTER DATABASE test
SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO
ALTER DATABASE test
SET READ_COMMITTED_SNAPSHOT ON ;
GO
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i CHAR(8000) DEFAULT(REPLICATE('a',8000))
, j CHAR(53) DEFAULT(REPLICATE('a',53))
) ;
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
एक और उदाहरण। यदि आप 49 में से 50 पर जाते हैं, तो आपको LAR_DATA पर जाने वाला VARCHAR (MAX) मिलता है।
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i VARCHAR(MAX) DEFAULT(REPLICATE('a',8000))
, j CHAR(49) DEFAULT(REPLICATE('a',49))
) ;
sp_tableoption N'tbl', 'large value types out of row', 'OFF' ;
GO
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
ऐसा प्रतीत होता है कि यह मुद्दा SQL Server 2012 में भी बना हुआ है। @SQLKiwi किम्बर्ली ट्रिप के इस पोस्ट की ओर इशारा करता है - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / ।