Azure SQL 数据库中的索引

Indexes in Azure SQL Database

我有一个 Azure SQL 数据库,到目前为止证明它非常成功。它已经使用了大约 20 个月,没有进行任何维护……但它已经处理了很多事情。一些 table 有数百万行,在查询索引列时,使用与之通信的 Web 应用程序时,查询响应时间是可接受的table。

但是,我阅读了有关重建索引的相互矛盾的建议。

这家伙说这样做没有意义:http://beyondrelational.com/modules/2/blogs/76/posts/15290/index-fragmentation-in-sql-azure.aspx

这家伙说继续重建: https://alexandrebrisebois.wordpress.com/2013/02/06/dont-forget-about-index-maintenance-on-windows-azure-sql-database/

我在一些存储几千行的较小 table 上有 运行 一些重建索引语句。一些碎片会减少大约 1/2...然后如果我 运行 第二次,它可能会减少大约

这些重建 运行 大约需要 2-10 秒,具体取决于 table...

的大小

然后我 运行 一个索引,该索引在 table 上有以下碎片,大约有 200 万行: PK__tmp_ms_x__CDEC17C03A4CDB46 55.2335782060565 PK__tmp_ms_x__CDEC17C03A4CDB46 0 IX_this_is_my_fk_index15.7538877620014

用了 33 分钟。

结果是 PK__tmp_ms_x__CDEC17C03A4CDB46 0.01 PK__tmp_ms_x__CDEC17C03A4CDB46 0 IX_this_is_my_fk_index 0

问题: 自从执行上述操作以来,查询速度并没有真正改变。这正常吗?

鉴于在 SQL Azure 中有很多我无法控制的事情,重建索引是否有意义?

顺便说一句:我不是也从来不是 DBA...只是开发人员

如果实际使用了索引,则重建索引很重要。如果索引没有被用于您 运行ning 的查询,那么您将看不出有什么不同。如果它只是被轻微使用,如果你 运行 统计数据,你会看到细微的差别。如果它被大量使用,大多数时候你应该会看到良好的性能提升。 Microsoft SQL 需要注意的另一件事是索引碎片有时是无关紧要的。通常当我选择是否重建索引时,我会查看页数和碎片。如果我 运行 正在查询并且我遇到性能问题,并且我正在使用索引,并且索引有超过 16000 页,并且索引有超过 50% 的碎片,我将重建它。如果 table 很小或者我可以使用在线选项,我会继续同时重建所有这些..

特别是对于 Azure,我的观点是,如果您正在尝试提高性能,这仍然是一个很好的步骤,因为它非常简单,即使您不能确定结果。不管是不是共享服务,能不能控制硬件层,查看索引碎片,重建索引都是你能做的,何乐而不为呢?

所以我想简短的回答是肯定的,在某些情况下。

我建议,不要手动检查索引并重建它们,而是在您的数据库最不活跃时设置一个 运行s 的夜间或每周作业。让它遍历所有 table 并重建索引。如果你有很多 tables,你也可以给它一个设定的 运行ning 时间,然后让它成为 "stateful"(你可以使用 table 来保留进度信息)所以它会记住它停止的地方并在下一个计划 运行.

恢复