[英]Where to find the size of SQL Server data types
I am trying to calculate the size of my database.我正在尝试计算我的数据库的大小。 I will have a table with 3 columns (id, int, money) I will have 26 million rows with all columns being occupied.
我将有一个包含 3 列(id、int、money)的表我将有 2600 万行,所有列都被占用。 How big will my database be?
我的数据库有多大? Also, where can I find the size of all SQL Server data types?
另外,在哪里可以找到所有 SQL Server 数据类型的大小?
Your can use below query :您可以使用以下查询:
SELECT * FROM sys.types
result of above query is below :上述查询的结果如下:
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
you can use max_length for size of each data type.您可以将 max_length 用于每种数据类型的大小。
T-SQL has a function for that: DATALENGTH
for all SQL Server versions. T-SQL 有一个功能:所有 SQL Server 版本的
DATALENGTH
。
Example:例子:
DECLARE @lat DECIMAL(10, 7) = 3.14151415141514151415;
SELECT @lat, DATALENGTH(@lat);
Result: 3.1415142
and 5
(because DECIMAL(10,7) uses 5 bytes to be stored).结果:
3.1415142
和5
(因为 DECIMAL(10,7) 使用 5 个字节来存储)。
Documentation: https://docs.microsoft.com/en-us/sql/t-sql/functions/datalength-transact-sql?view=sql-server-ver15文档: https : //docs.microsoft.com/en-us/sql/t-sql/functions/datalength-transact-sql?view=sql-server-ver15
For example, I have a table called Applications
with these columns: ( id VARCHAR(32), debug BIT, connectionString VARCHAR(2048), firebaseKey VARCHAR(4096)
).例如,我有一个名为
Applications
的表,其中包含以下列:( id VARCHAR(32), debug BIT, connectionString VARCHAR(2048), firebaseKey VARCHAR(4096)
)。 As we know, VARCHAR doesn't allocate all the space (just what you need, so 'A'
is 1 byte in VARCHAR).正如我们所知,VARCHAR 不会分配所有空间(正是您需要的空间,因此
'A'
在 VARCHAR 中是 1 个字节)。
These queries:这些查询:
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;
will return my data size (in my case, with my rows, is 8, 2, 366, 4698 (total: 5074). There are 2 rows in that table.将返回我的数据大小(在我的情况下,我的行是 8、2、366、4698(总计:5074)。该表中有 2 行。
Notice that this does NOT represent the total size of my database (there are pages, descriptors, indexes, etc. involved.) *请注意,这并不代表我的数据库的总大小(涉及页面、描述符、索引等。) *
MSSQL has internal stored procedures to tell you the exactly size of your database in disk: MSSQL 具有内部存储过程,可以告诉您磁盘中数据库的确切大小:
EXEC sp_spaceused;
for all database;EXEC sp_spaceused N'schema.TableName';
for a specific table;EXEC sp_helpdb N'DatabaseName';
if you want details from each file.http://msdn.microsoft.com/en-us/library/ms187752.aspx http://msdn.microsoft.com/en-us/library/ms187752.aspx
Money : 8 bytes
int : 4 bytes
id - depends on what you mean.
If the table specified in the where clause contains a nvarchar, this query will give you how many characters there are for that column correctly!如果 where 子句中指定的表包含 nvarchar,则此查询将为您提供该列正确的字符数!
This detects if the column is "wide" and essentially divides by 2. More broad than just 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
Of course, you can just divide max_length on sys.columns by 2 if you know the column is an nvarchar.当然,如果您知道该列是 nvarchar,您可以将 sys.columns 上的 max_length 除以 2。 This is more for discovering table schema in a way that seems better for if new sql data types are introduced in the future.
如果将来引入新的 sql 数据类型,这更多地是为了以一种更好的方式发现表模式。 And you so-choose to upgrade to it.
你选择升级到它。 Pretty small edge case.
非常小的边缘情况。
Please edit and correct this answer if you find an edge case where bytes and bits are incorrect.
如果您发现字节和位不正确的边缘情况,请编辑并更正此答案。
Details:细节:
-- ([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
If someone knows that SQL Server stores the bit and byte sizes for each data type.如果有人知道 SQL Server 存储每种数据类型的位和字节大小。 Or a better way to get sys.columns size, please leave a comment!
或者更好的获取 sys.columns 大小的方法,请发表评论!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.