【问题标题】:SQL Server : what happens in delete with indexSQL Server:使用索引删除会发生什么
【发布时间】:2016-10-20 23:53:35
【问题描述】:

我有一个 3600 万行的堆表,我正在尝试删除选定的 600 万行。当我在 100 批中删除时,读取为 16++++++,写入为 113,因此我在 Identity 列上添加了 NON-clus 索引以加快读取速度,现在读取为 34899,写入为 3508,并添加了一个 NON-clus Idx它增加了写入 IO 的增长。

那么要知道为什么 SQL Server 在后台执行的操作与我看到的表删除计划中的差异如此之大是 8% 并且没有更多详细信息。

此外,当我删除我的数据页面并且使用的页面越来越多时,令人难以置信..我查询 sys.allocation 单位来检查

当我删除 2500 行时,我的日志文件增加到 42 MB,碎片从 0.02 增加到 2.96

只是在执行此操作之前添加更多内容,我删除了 2 个 Nvarchar 列,然后清理表并重建它

【问题讨论】:

  • 我有点理解你的问题是一个信息而不是问题。
  • 如果您有一个堆并在没有 TABLOCK 提示的情况下删除,SQL Server 不会释放空间。这当然使它更简单,但在某些时候你需要对浪费的空间做点什么......

标签: sql sql-server sql-server-2012 sql-server-2014


【解决方案1】:

将非聚集索引更改为聚集索引。当您从表中删除行时,SQL Server 必须从堆中删除页并从索引中删除页。如果你有一个聚集索引,那么 SQL Server 只需从这个索引中删除行。

【讨论】:

  • 谢谢 :) 我确实改变了.. 现在读取的是 252 ,这在这种情况下被认为是最好的。但是,当我再添加一个带有另外 4 列(nvarchar、int、money)的非集群索引时,再次读取会达到 1300。这是行为还是我需要为此考虑填充因子?
  • 任何删除都必须从表和索引中删除数据。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 2017-06-16
  • 1970-01-01
  • 2012-03-02
  • 2022-06-27
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多