स्लॉट ऐरे और कुल पृष्ठ का आकार


13

मैं कई मंचों पर और कई ब्लॉगों पर पढ़ना जारी रखता हूं जिनमें एक पृष्ठ नीचे दिखाया गया है: पृष्ठ का आकार: 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 /


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट 9

जवाबों:


8

जहां पृष्ठों को आंतरिक उद्देश्यों के लिए उपयोग किया जाता है, जैसे कि रन रन, अधिकतम पंक्ति आकार 8094 बाइट्स । डेटा पृष्ठों के लिए, आंतरिक पंक्ति ओवरहेड सहित अधिकतम-पंक्ति आकार 8060 बाइट्स है

यदि आंतरिक इंजन उपयोग में हैं तो आंतरिक पंक्ति ओवरहेड महत्वपूर्ण रूप से विस्तारित हो सकती है। उदाहरण के लिए, विरल स्तंभों का उपयोग करने से उपयोगकर्ता-सुलभ डेटा का आकार 8019 बाइट्स तक कम हो जाता है।

एक्सक्लूसिव रो ओवरहेड का एकमात्र उदाहरण जो मुझे SQL सर्वर 2012 तक पता है, संस्करण पंक्तियों के लिए आवश्यक 14 बाइट्स है । यह बाहरी ओवरहेड एक पंक्ति पंक्ति के लिए अधिकतम स्थान उपयोग 8074 बाइट्स के लिए लाता है, साथ ही एकल स्लॉट सरणी प्रविष्टि के लिए 2 बाइट्स, कुल 8076 बाइट्स बनाता है। यह अब भी 8096 सीमा (8192 पृष्ठ आकार - 96 बाइट फिक्स्ड हेडर) से 20 बाइट्स छोटा है।

सबसे अधिक संभावना स्पष्टीकरण यह है कि मूल 8060 बाइट सीमा भविष्य के विस्तार के लिए 34 बाइट्स छोड़ती है, जिनमें से 14 का उपयोग पंक्ति-संस्करण कार्यान्वयन के लिए किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.