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 / 问题 / 334815
Accepted
vacip
vacip
Asked: 2024-01-13 16:30:37 +0800 CST2024-01-13 16:30:37 +0800 CST 2024-01-13 16:30:37 +0800 CST

大幅缩减后 Azure SQL 索引重建

  • 772

我们在 Azure SQL 数据库中有一个表,该表曾经有一个存储 pdf 文件的 nvarchar(max) 列。(外部开发人员的奇迹。)表增长到 156 GB。它有 476000 行。更改逻辑后,我们不再需要 pdf 列。删除其中数据的唯一合理方法是删除该列并重新创建该列(以防某些奇怪的进程仍在引用它)。

但是,表大小仍报告为 156 GB。我刚刚创建的备份表 (SELECT INTO) 是 128 MB,因此这似乎是数据的实际大小。

我让索引重建(在线)在聚集 PK 索引上运行过夜。它在 8 到 12 小时之间的某个时间因 TCP 错误而失败。该索引仍存在 95% 的碎片,报告的大小仍为 156 GB。

有没有解释为什么这么慢?有没有更好的办法?生产数据库、表由网站使用,必须可访问,因此不能离线执行,除非需要不到 10 分钟 - 没有人可以保证。

我可以在备份表上建立所有索引,删除原始表并重命名备份吗?这听起来很冒险(丢失在错误时间创建的记录的风险很小)。


我正在努力让 Azure 意识到它不再被使用。已分配,我对此表示同意。用过,没那么多:

在此输入图像描述

有问题的表:

在此输入图像描述

同样,问题不是保留空间,而是已使用空间。

azure-sql-database
  • 1 1 个回答
  • 38 Views

1 个回答

  • Voted
  1. Best Answer
    J.D.
    2024-01-13T23:09:20+08:002024-01-13T23:09:20+08:00

    但是,表大小仍报告为 156 GB。

    是的,这是预期的。

    为什么?

    SQL Server 中空间分配的工作方式是,随着数据的增长,空间会从磁盘分配到 SQL Server 实例中该数据库的内部文件,块的大小是在数据库属性中定义的,在文件 -> 自动增长下设置:

    自动增长设置

    这会主动将数据保留在磁盘之外,并确保将来向该数据库添加更多数据时可用。文件增长操作是相当繁重的操作,这就是为什么数据库文件不以与数据本身增长相同的速率和数量增长的原因。

    文件缩小也是如此。这是一项昂贵的手术。默认情况下,数据库设计为在删除数据时不会自动收缩。假设已经从磁盘占用的空间最终将被重新使用。因此,当数据被删除时,它不会将其释放回磁盘,而是在内部进行标记,以便将来的数据覆盖它时重新使用。这听起来可能很浪费,但磁盘很便宜,而性能却不便宜,这是通过在每次数据更改时不不断增长和缩小而隐含获得的。

    一个有用的工具是系统存储过程sp_spaceused。如果您在特定数据库的上下文中运行它,不带任何参数,它会告诉您该数据库的总大小 -database_size在第一个结果集中,以及该磁盘空间当前在数据库文件中的分布情况 - reservedvs datavs index_sizein第二个结果集。以前,列中可能有大约 156 GB 的空间,data现在将显示该空间reserved,这意味着它已准备好被未来的数据增长所消耗。

    现在来解决您的问题

    SQL Server 有一个收缩命令(也可以通过 SSMS GUI 执行),它将把数据库文件中的保留空间释放回磁盘(尽可能多地释放,其中有一些if、ands 或 buts)。通常建议不要这样做,因为收缩是对磁盘的繁重操作,并且可能会影响并发数据库性能,直到完成为止,并且因为一旦将更多数据添加到数据库,释放的空间将不得不再次经历繁重的增长操作。但在像您的情况这样的特殊的一次性大数据更改中,如果您确实需要的话,这样做可能是明智的。

    边注

    索引重建通常是一种浪费和浪费的操作 - 导致文件增长,这基本上会抵消因收缩而释放的一些空间。这是一个恶性循环。如果您这样做是为了提高性能,那么您实际上不太可能从重建本身中获得任何好处(索引碎片在现代硬件上确实不再重要)。重建会触发后续的操作,这些操作可能会提高您的性能,例如清除计划缓存和更新统计信息。但是您可以单独、更精细、更高效地运行这些操作,而无需进行浪费的索引重建。

    • 1

相关问题

  • 使用限制和偏移的单选与多选

  • 是否可以在 SQL Azure 中创建数百个数据库而不是一个大数据库并冒死锁的风险

  • 在 SQL Azure 中实现加密表

  • 将服务器链接到 SQL Azure 非常慢

  • 如何更改 SQL Azure 上的现有主键?

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