2012-08-28 11 views
10

मैं अपने डेटाबेस के आकार की गणना करने की कोशिश कर रहा हूं। मेरे पास 3 कॉलम (आईडी, int, money) वाली एक टेबल होगी, मेरे पास 26 मिलियन पंक्तियां होंगी जिनमें सभी कॉलम पर कब्जा होगा। मेरा डेटाबेस कितना बड़ा होगा? साथ ही, मैं सभी SQL सर्वर डेटा प्रकारों का आकार कहां पा सकता हूं?SQL सर्वर डेटा प्रकारों का आकार कहां खोजें

+4

शायद एक अच्छी शुरुआत: http://msdn.microsoft.com/en-us/library/ms175991.aspx –

+3

आपको एहसास है कि आपको डीबी इंटर्नल्स के बारे में एक सटीक संख्या में पहुंचने के बारे में बहुत कुछ पता होना है? अपनी इच्छित सेटिंग्स के साथ डमी डेटा के साथ उस आकार की एक तालिका बनाना संभवतः संभव है, और उसके बाद आकार की जांच करें। सौ कम-स्तरीय चिंताओं हैं जो आवश्यक बाइट्स की संख्या से जोड़ या घटा सकते हैं। स्नैपशॉट अलगाव सक्षम होने पर – delnan

उत्तर

18

आपकी क्वेरी से नीचे का उपयोग कर सकते हैं:

SELECT * FROM sys.types 

ऊपर क्वेरी के परिणाम के नीचे है:

name     system_type_id user_type_id schema_id principal_id max_length precision scale collation_name is_nullable is_user_defined is_assembly_type default_object_id rule_object_id is_table_type 
-------------------- -------------- ------------ --------- ------------ ---------- --------- ----- ----------------- ----------- --------------- ---------------- ----------------- -------------- ------------- 
image    34    34   4   NULL   16   0   0  NULL    1   0    0    0     0    0 
text     35    35   4   NULL   16   0   0  Persian_100_CI_AI 1   0    0    0     0    0 
uniqueidentifier  36    36   4   NULL   16   0   0  NULL    1   0    0    0     0    0 
date     40    40   4   NULL   3   10  0  NULL    1   0    0    0     0    0 
time     41    41   4   NULL   5   16  7  NULL    1   0    0    0     0    0 
datetime2   42    42   4   NULL   8   27  7  NULL    1   0    0    0     0    0 
datetimeoffset  43    43   4   NULL   10   34  7  NULL    1   0    0    0     0    0 
tinyint    48    48   4   NULL   1   3   0  NULL    1   0    0    0     0    0 
smallint    52    52   4   NULL   2   5   0  NULL    1   0    0    0     0    0 
int     56    56   4   NULL   4   10  0  NULL    1   0    0    0     0    0 
smalldatetime  58    58   4   NULL   4   16  0  NULL    1   0    0    0     0    0 
real     59    59   4   NULL   4   24  0  NULL    1   0    0    0     0    0 
money    60    60   4   NULL   8   19  4  NULL    1   0    0    0     0    0 
datetime    61    61   4   NULL   8   23  3  NULL    1   0    0    0     0    0 
float    62    62   4   NULL   8   53  0  NULL    1   0    0    0     0    0 
sql_variant   98    98   4   NULL   8016  0   0  NULL    1   0    0    0     0    0 
ntext    99    99   4   NULL   16   0   0  Persian_100_CI_AI 1   0    0    0     0    0 
bit     104   104   4   NULL   1   1   0  NULL    1   0    0    0     0    0 
decimal    106   106   4   NULL   17   38  38 NULL    1   0    0    0     0    0 
numeric    108   108   4   NULL   17   38  38 NULL    1   0    0    0     0    0 
smallmoney   122   122   4   NULL   4   10  4  NULL    1   0    0    0     0    0 
bigint    127   127   4   NULL   8   19  0  NULL    1   0    0    0     0    0 
hierarchyid   240   128   4   NULL   892  0   0  NULL    1   0    1    0     0    0 
geometry    240   129   4   NULL   -1   0   0  NULL    1   0    1    0     0    0 
geography   240   130   4   NULL   -1   0   0  NULL    1   0    1    0     0    0 
varbinary   165   165   4   NULL   8000  0   0  NULL    1   0    0    0     0    0 
varchar    167   167   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
binary    173   173   4   NULL   8000  0   0  NULL    1   0    0    0     0    0 
char     175   175   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
timestamp   189   189   4   NULL   8   0   0  NULL    0   0    0    0     0    0 
nvarchar    231   231   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
nchar    239   239   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
xml     241   241   4   NULL   -1   0   0  NULL    1   0    0    0     0    0 
sysname    231   256   4   NULL   256  0   0  Persian_100_CI_AI 0   0    0    0     0    0 
CalculatedCreditInfo 243   257   9   NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_QoutaDetail  243   258   21  NULL   -1   0   0  NULL    0   1    0    0     0    1 
BeforeUpdate   243   259   22  NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_StoreInventory 243   260   26  NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_WKFHistory  243   261   32  NULL   -1   0   0  NULL    0   1    0    0     0    1 
IDTable    243   262   1   NULL   -1   0   0  NULL  

आप प्रत्येक डेटा प्रकार के आकार के लिए MAX_LENGTH उपयोग कर सकते हैं।

+0

यह आकार नहीं दिखाता है। उदाहरण के लिए, एक्सएमएल रिक्त चर का आकार 5 है, जहां यह कहता है? –

+0

आप इस उत्तर के लिए एक अच्छा पूरक (यदि कोई बेहतर विकल्प नहीं है) देख सकते हैं [यहां] (http://dba.stackexchange.com/questions/147296/where-to-find-the-size-of-sql- सर्वर -डेटा प्रकार/147315 # 147315) –

+1

nvarchar 2 बाइट चौड़ा है। इसलिए sys.columns.max_length = 44. लेकिन वास्तविक लंबाई 22 है। डेटा प्रकार का वास्तविक आकार कहां दिखाया जाएगा? अधिकतम आकार उस प्रकार का कॉलम नहीं हो सकता है। – TamusJRoyce

1

http://msdn.microsoft.com/en-us/library/ms187752.aspx

Money : 8 bytes 
int : 4 bytes 
id - depends on what you mean. 
+0

+ अन्य पंक्ति ओवरहेड जैसे 'NULL_BITMAP' और स्टेटस बिट्स संभावित संस्करण पॉइंटर। –

0

यदि खंड में निर्दिष्ट तालिका में nvarchar है, तो यह क्वेरी आपको बताएगी कि उस कॉलम के लिए कितने अक्षर सही हैं!

यह पता लगाता है कि कॉलम "चौड़ा" है और अनिवार्य रूप से 2 से विभाजित होता है। केवल nvarchar से अधिक व्यापक।

SELECT c.name, (CASE WHEN LEFT(ts.name, 1) = 'n' AND ts.[precision] = 0 AND ts.[scale] = 0 THEN c.max_length/ts.[bytes] ELSE c.max_length END) AS [length] 
FROM sys.columns AS c 
    INNER JOIN sys.tables AS t 
     ON t.object_id = c.object_ID 
    INNER JOIN 
    (
     SELECT *, (CASE WHEN [bits] = -1 THEN -1 ELSE ([bits] + 7)/8 END) AS [bytes] 
     FROM (
      SELECT *, (CASE WHEN max_length >= 256 THEN (CASE WHEN LEFT(name, 1) = 'n' AND [precision] = 0 AND [scale] = 0 THEN 16 ELSE 8 END) ELSE max_length END) AS [bits] 
      FROM sys.types AS iits 
     ) AS its 
    ) AS ts 
     ON ts.user_type_id = c.user_type_id 
WHERE t.name LIKE 'tb_tablename' -- LIKE is case insensitive 
बेशक

, तो आप सिर्फ 2 से sys.columns पर MAX_LENGTH विभाजित करते हैं, क्या आप जानते हैं स्तंभ कोई nvarchar है सकते हैं। टेबल स्कीमा को इस तरह से खोजने के लिए यह और अधिक है जो भविष्य में नए एसक्यूएल डेटा प्रकार पेश किए जाने के लिए बेहतर लगता है। और आप इसे अपग्रेड करना चुनते हैं। बहुत छोटा किनारा मामला।

अगर आपको कोई एज केस मिलता है तो बाइट्स और बिट्स गलत हैं तो कृपया इस उत्तर को संपादित और सही करें।

विवरण:

-- ([bits] + 7)/8 means round up 
-- 
-- Proof: 
-- o (1 bit + 7 = 8)/8 = 1 byte used 
-- o ((8 + 8 + 1 = 17 bytes) + 7 = 24)/8 = 3 byes used 
-- o ((8 + 8 + 7 = 23 bytes) + 7 = 30)/8 = 3.75 = integer division removes decimal = 3 
SELECT *, (CASE WHEN [bits] = -1 THEN -1 ELSE ([bits] + 7)/8 END) AS [bytes] 
FROM (
    SELECT *, (CASE WHEN max_length >= 256 THEN (CASE WHEN LEFT(name, 1) = 'n' AND [precision] = 0 AND [scale] = 0 THEN 16 ELSE 8 END) ELSE max_length END) AS [bits] 
    FROM sys.types AS its 
) AS ts 

कोई जानता है कि एसक्यूएल सर्वर भंडार प्रत्येक डेटा प्रकार के लिए थोड़ा और बाइट आकार। या sys.columns आकार प्राप्त करने का एक बेहतर तरीका है, कृपया एक टिप्पणी छोड़ दो!

संबंधित मुद्दे