10

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

4

4 回答 4

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 用于每种数据类型的大小。

于 2012-08-29T04:08:45.810 回答
1

T-SQL 有一个功能:DATALENGTH适用于所有 SQL Server 版本。

例子:

DECLARE @lat DECIMAL(10, 7) = 3.14151415141514151415;

SELECT @lat, DATALENGTH(@lat);

结果: 3.14151425(因为 DECIMAL(10,7) 使用 5 个字节来存储)。

文档:https ://docs.microsoft.com/en-us/sql/t-sql/functions/datalength-transact-sql?view=sql-server-ver15

例如,我有一个Applications用这些列调用的表:( id VARCHAR(32), debug BIT, connectionString VARCHAR(2048), firebaseKey VARCHAR(4096))。正如我们所知,VARCHAR 不会分配所有空间(正是您需要的,'A'VARCHAR 中的 1 个字节也是如此)。

这些查询:

SELECT 
  SUM(DATALENGTH(id)) AS idSize,
  SUM(DATALENGTH(debug)) AS debugSize,
  SUM(DATALENGTH(connectionString)) AS connectionStringSize,
  SUM(DATALENGTH(firebaseKey)) AS firebaseKeySize
FROM Applications;

SELECT 
  SUM(
    DATALENGTH(id) +
    DATALENGTH(debug) + 
    DATALENGTH(connectionString) +
    DATALENGTH(firebaseKey)
  ) AS totalSize
FROM Applications;

将返回我的数据大小(在我的情况下,我的行是 8、2、366、4698(总计:5074)。该表中有 2 行。

请注意,这并不代表我的数据库的总大小(涉及页面、描述符、索引等。) *

MSSQL 具有内部存储过程,可以告诉您磁盘中数据库的确切大小:

  • EXEC sp_spaceused;对于所有数据库;
  • EXEC sp_spaceused N'schema.TableName';对于特定的表;
  • EXEC sp_helpdb N'DatabaseName';如果您想要每个文件的详细信息。
于 2021-01-12T00:11:50.393 回答
0

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

Money : 8 bytes
int : 4 bytes
id  - depends on what you mean.
于 2012-08-28T19:21:06.697 回答
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 大小的更好方法,请发表评论!

于 2017-10-11T19:42:31.507 回答