AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 172252
Accepted
Henrik Staun Poulsen
Henrik Staun Poulsen
Asked: 2017-04-29 03:23:36 +0800 CST2017-04-29 03:23:36 +0800 CST 2017-04-29 03:23:36 +0800 CST

使用页面压缩时的行开销是多少?

  • 772

我创建了一个包含 650 个 Numeric(19,4) 列的表。当我打开页面压缩时,通过运行

ALTER TABLE fct.MyTable REBUILD  WITH (DATA_COMPRESSION = PAGE);

我明白了

消息 1975,级别 16,状态 1
索引“PK_Mytable”行长度超过了“8060”字节的最大允许长度。

但是 650 乘以 9 字节只有 5850 字节,与规定的 8060 字节限制相去甚远。

服务器正在运行带有 SQL Server 2016 SP1 CU2 的 Windows 2012 r2

使用页面压缩时的行开销是多少?

这是一些代码来说明我的意思:

/* test script to demo MSG 1975 */
DECLARE @sql NVARCHAR(max)='', @i INT =0
drop table if exists dbo.mytable;

SET @sql = 'Create table dbo.Mytable (MyTableID bigint not null 
  identity(1,1) primary key clustered, '

WHILE @i < 593 BEGIN
    SET @sql += ' Column' + LTRIM(@i) + ' numeric(19,4) null, '
    SET @i +=1
END

SET @sql += ' LastColumn int) '
--SET @sql += ' with (DATA_COMPRESSION = ROW) '
SET @sql += ' with (DATA_COMPRESSION = PAGE) '

SELECT @sql
EXEC sys.sp_executesql @sql

SELECT top 10000 * FROM dbo.MyTable MT

行压缩也会失败,但行数不同。

sql-server-2016 compression
  • 1 1 个回答
  • 1598 Views

1 个回答

  • Voted
  1. Best Answer
    AMtwo
    2017-04-29T05:04:16+08:002017-04-29T05:04:16+08:00

    如果您尝试在没有集群 PK 约束的情况下创建表,您会得到一个稍微不同的错误:

    消息 1701,级别 16,状态 1,第 1 行创建或更改表“Mytable”失败,因为最小行大小为 8067,包括 1530 字节的内部开销。这超出了允许的最大表行大小 8060 字节。

    在此错误消息中,您可以看到页面压缩有 1530 字节的内部开销。

    现在,您可以进行数学运算:

    • bigintMyTableID 8 个字节
    • intLastColumn 4 个字节
    • 593 列中的每一列 9 个字节numeric(19,4)(总共 5337 个字节)
    • 1530 字节的压缩开销

    所以,8 + 4 + (593*9) + 1530 = 6879。 等一下.... 仍然低于 8060。这是怎么回事?!


    Page Compression 算法实际上是把几个压缩算法堆叠在一起。第一步是应用 ROW 压缩。行压缩的开销不包括在该错误消息中列出的 1530 字节开销中。

    您可以在我的博客和BOL中阅读有关行压缩如何工作的更多信息。您将在 BOL 文章中注意到,它将numeric存储描述为“此存储与 vardecimal 存储格式完全相同”,但没有解释vardecimal. 这篇文章涵盖vardecimal了更多内容——本质上,它为每列增加了 2 个字节的开销来存储实际长度(类似于varchar所做的)。

    行压缩对于 593 列中的每一列都需要额外的 2 个字节numeric,再加上bigint和,每列int将需要 1 个字节的开销。

    行压缩存储要求为:

    • bigintMyTableID的 8 字节 + 1 字节开销
    • intLastColumn的 4 字节 + 1 字节开销
    • numeric(19,4)593列中的每一列的 9 字节 + 2 字节开销
    • 1188 字节的 ROW 压缩开销

    8 + 4 + (593*9) = 5349 字节数据

    1 + 1 + (593*2) = 1188 字节行压缩开销

    行压缩模式总共 6537 字节


    现在我们有了行压缩模式的行大小,我们可以重新审视我们的数学。页面压缩的行大小将是数据大小 + 行压缩开销 + 页面压缩开销:

    • bigintMyTableID 8 个字节
    • intLastColumn 4 个字节
    • numeric(19,4)593列中的每一列 9 个字节
    • 1188 字节的 ROW 压缩开销
    • 1530 字节的 PAGE 压缩开销
      5349 字节数据
    + 1188 字节行压缩开销
    + 1530 字节的页面压缩开销
    

    总共 8067 字节

    • 13

相关问题

  • T-SQL 脚本以最大压缩级别执行压缩备份 [重复]

  • 具有很少不同条目的字符串列是否会自动压缩?

  • 压缩和存储 SQL Server 备份的最有效方法是什么?[关闭]

  • 从 SQL Server 检索的数据是否经过压缩传输?

  • SQL 2008 Merge Replication 和表级数据压缩

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve