为什么行大小很大?

时间:2019-01-02 22:36:19

标签: sql-server azure azure-sql-database

我在sql数据库(Azure)中有一个名为Alerta的表,该表具有三列,两个浮点类型(float)和一个datetime类型列,问题是数据库的填充速度非常快,我已经搜索了一个解决方案,我发现这可能是此post

中表格的大小

我执行了以下代码,我发现Alerta表的每行字节为27411字节

这是我执行以确定字节/行的代码:

select 
o.name, 
max(s.row_count) AS 'Rows',
sum(s.reserved_page_count) * 8.0 / (1024 * 1024) as 'GB',
(8 * 1024 * sum(s.reserved_page_count)) / (max(s.row_count)) as 'Bytes/Row'
from sys.dm_db_partition_stats s, sys.objects o
where o.object_id = s.object_id
group by o.name
having max(s.row_count) > 0
order by GB desc

这是桌子的设计;该表没有索引,甚至没有主键

design of the table

我还执行了该post的查询,以确定每个索引的大小,这就是results

我很困惑,因为表只有三列,但是我没有找到减小表的行大小的解决方案

1 个答案:

答案 0 :(得分:0)

SQL Server(Azure)中允许的最大行大小为8060字节,但是执行代码后得到的结果是Alerta表的每行字节为27411字节。 enter image description here

我认为您可以尝试以下script来获取每行大小的agian:

declare @table nvarchar(128)
declare @idcol nvarchar(128)
declare @sql nvarchar(max)

--initialize those two values
set @table = 'YourTable'
set @idcol = 'some id to recognize the row'

set @sql = 'select ' + @idcol +' , (0'

select @sql = @sql + ' + isnull(datalength(' + name + '), 1)' 
        from  sys.columns 
        where object_id = object_id(@table)
        and   is_computed = 0
set @sql = @sql + ') as rowsize from ' + @table + ' order by rowsize desc'

PRINT @sql

exec (@sql)

将结果与您的结果进行比较。例如,我创建了一个表并通过SSMS运行脚本:

select * , (0 + isnull(datalength(price), 1) + isnull(datalength(money), 1) + isnull(datalength(date), 1)) as rowsize from test order by rowsize desc

enter image description here

希望这可以为您提供帮助。