2012-08-28 58 views
10

我想计算我的数据库的大小。我将有一个3列(id,int,money)的表格,我将拥有2600万行,所有列都被占用。我的数据库有多大?另外,我在哪里可以找到所有SQL Server数据类型的大小?在哪里可以找到SQL Server数据类型的大小

+4

也许是一个好开始:http://msdn.microsoft.com/en-us/library/ms175991.aspx –

+3

你意识到你必须知道一个关于DB内部的很多才能得到一个准确的数字?使用您所需的设置创建具有虚拟数据的大小的表格可能更容易,然后检查大小。有一百个低级关注点可以增加或减少所需字节数。 – 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

这不显示大小。例如,XML空变量的大小是5,它在那里表示它的位置? –

+0

你可以看到一个很好的补充(如果不是更好的选择)这个答案[这里](http://dba.stackexchange.com/questions/147296/where-to-find-the-size-of-sql-server -data-types/147315#147315) –

+1

nvarchar是2个字节宽。所以sys.columns.max_length = 44,但实际长度是22.在那里会显示数据类型的实际大小?不是该类型的列的最大大小。 – TamusJRoyce

0

如果where子句中指定的表包含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 

当然,如果您知道列是nvarchar,您可以将sys.columns的max_length除以2。这对于发现表格模式来说更为合适,因为将来如果引入新的SQL数据类型,似乎会更好。而且你选择升级到它。相当小的边缘情况。

如果发现 字节和位不正确的边缘情况,请编辑并更正此答案。

详情:

-- ([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 

如果有人知道SQL Server存储位和字节大小为每个数据类型。或者更好的方式来获得sys.columns的大小,请留下评论!

相关问题