【问题标题】:Why the row size is very big?为什么行大小很大?
【发布时间】:2019-01-02 22:36:19
【问题描述】:

我在一个 sql 数据库 (Azure) 中有一个名为 Alerta 的表,它有三列,两列浮动类型 (float) 和一个日期时间类型列,问题是数据库填得非常快,我搜索了一个解决方案,我发现这可能是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

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

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

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

【问题讨论】:

  • 向我们展示您的表结构。 Sql 查询可能会给您带来洞察力,但对我们没有影响
  • 鉴于您的表格是两个浮点数和一个日期时间,这对我来说似乎很奇怪。但是,表上有多少索引?您可以使用相同的 DMV 获取每个索引的使用情况,因为 index_id 在那里表示。我也对您的数据突变在该表上的样子感兴趣。也就是数据是怎么插入的?它是如何更新的?其中任何一个(或两者)都可能对索引碎片产生影响(我也有兴趣了解该特定表的外观)。
  • @BenThul 数据是通过 Azure 的流分析作业插入的,数据每四秒插入一次,表没有任何索引。
  • “如何”的问题与所涉及的特定技术相比较少,而更多的是“关于任何相关索引如何插入数据?”。由于您已声明该表没有任何索引,因此您正在插入一个堆。插入后数据会更新吗?删除是如何发生的?至少,我强烈建议在您的表上放置一个聚集索引。堆对某些事情有好处,但是对它们的持续数据访问并不是很好。关于那张桌子的碎片有什么说法吗?
  • @BenThul 你好,我做了一个查询来检查索引碎片,堆的碎片不到 6%,但是我做到了你说,我创建了一个聚集索引,问题就解决了,但我不知道为什么......请你解释一下原因吗?

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


【解决方案1】:

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

我认为您可以尝试以下 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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多