删除操作很慢,重建索引似乎无法解决问题
Delete operation is slow and rebuilding index doesn't seems to solve the issue
我有一个简单的删除查询:
Delete from sales
where ImportLogId = @ImportLogid
ImportLog table 有大约 300 万条记录,包含所有日志详细信息。
我在 ImportLogID table 的 ImportLogID 上创建了非聚集索引。
碎片率低于 10%,但查询仍然需要更多时间来执行,但当我手动重建索引时,它会在一秒钟内执行。一天后同样的问题重复出现。
使用代码重建索引似乎没有帮助,但在 SQL 服务器 UI 中重建索引有帮助。
使用 SQL 查询和手动使用 UI 重建索引有什么区别?
为什么碎片较少的索引也需要更多的时间来执行,而当我重建索引时它会在一秒钟内执行?
- 页面丰满度为 99.71%
- 总碎片率为 4%
寻找更好的解决方案
没错。所以你的问题不是记录的删除,这是瞬间的。 (84 行)。问题是之后对 WholesalerSale table 的扫描。
我的猜测是,ImportSale.Id 是 WholesalerSale 中的外键,而 SqlServer 只是验证您没有删除引用的键。
解决方案是在 WholesalerSale 中索引您的外键列以加快此检查。
CREATE INDEX IX_WholesalerSale_ImportSaleId ON WholesalerSales (ImportSaleId);
我有一个简单的删除查询:
Delete from sales
where ImportLogId = @ImportLogid
ImportLog table 有大约 300 万条记录,包含所有日志详细信息。
我在 ImportLogID table 的 ImportLogID 上创建了非聚集索引。
碎片率低于 10%,但查询仍然需要更多时间来执行,但当我手动重建索引时,它会在一秒钟内执行。一天后同样的问题重复出现。 使用代码重建索引似乎没有帮助,但在 SQL 服务器 UI 中重建索引有帮助。
使用 SQL 查询和手动使用 UI 重建索引有什么区别? 为什么碎片较少的索引也需要更多的时间来执行,而当我重建索引时它会在一秒钟内执行?
- 页面丰满度为 99.71%
- 总碎片率为 4%
寻找更好的解决方案
没错。所以你的问题不是记录的删除,这是瞬间的。 (84 行)。问题是之后对 WholesalerSale table 的扫描。
我的猜测是,ImportSale.Id 是 WholesalerSale 中的外键,而 SqlServer 只是验证您没有删除引用的键。
解决方案是在 WholesalerSale 中索引您的外键列以加快此检查。
CREATE INDEX IX_WholesalerSale_ImportSaleId ON WholesalerSales (ImportSaleId);