22

在本地 SQL 数据库中,通常有一个维护计划来不时重建索引,而此时它并没有被太多使用。

如何在 Azure SQL DB 中进行设置?

PS:我之前尝试过,但由于我找不到任何选项,我想他们可能会自动执行此操作,直到我阅读了这篇文章并尝试过:

SELECT
 DB_NAME() AS DBName
 ,OBJECT_NAME(ps.object_id) AS TableName
 ,i.name AS IndexName
 ,ips.index_type_desc
 ,ips.avg_fragmentation_in_percent
 FROM sys.dm_db_partition_stats ps
 INNER JOIN sys.indexes i
 ON ps.object_id = i.object_id
 AND ps.index_id = i.index_id
 CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips
 ORDER BY ps.object_id, ps.index_id

并发现我有需要维护的索引 在此处输入图像描述

4

5 回答 5

46

更新:请注意,工程团队已发布更新的指南,以更好地在 Microsoft 的更“官方”位置编纂此答案中的一些建议,因为一些客户要求这样做。 SQL Server/DB 索引指南。谢谢,康纳

原答案:

我要指出,大多数人根本不需要考虑在 SQL Azure 中重建索引。是的,B+ 树索引可能会变得碎片化,是的,与完美调整的索引相比,这可能会导致一些空间开销和一些 CPU 开销。因此,在某些情况下,我们会与客户合作重建索引。(主要场景是客户可能会用完空间,目前,由于当前架构,SQL Azure 中的磁盘空间有些受限)。因此,我鼓励您退后一步,考虑使用 SQL Server 模型来管理数据库并不是“错误的”,但它可能值得您努力,也可能不值得。

(如果您最终需要重建索引,欢迎您使用其他发帖人在此处发布的模型 - 它们通常是编写任务脚本的好模型。请注意,SQL Azure 托管实例还支持您也可以使用的 SQL 代理如果您愿意,可以创建作业以编写维护操作脚本)。

以下是一些可以帮助您决定是否适合进行索引重建的详细信息:

  • 您引用的链接来自 2013 年的一篇文章。在那篇文章之后,SQL Azure 的架构完全重做。具体来说,硬件架构从基于本地旋转磁盘的模型转变为基于本地 SSD 的模型(在大多数情况下)。因此,原始帖子中的指导已过时。
  • 在当前架构中,您可能会遇到碎片索引空间不足的情况。您可以选择重建索引或在一段时间内迁移到更大的预留大小(这将花费更多钱),以支持更大的磁盘空间分配。[由于机器上的本地SSD空间有限,预留大小大致与机器的比例挂钩。随着我们获得具有更大/更多驱动器的更新硬件,您将拥有更多扩展选项]。
  • 与旋转磁盘相比,SSD 碎片的影响相对较低,因为随机 IO 的成本实际上并不高于顺序 IO。多走几个 B+ 树中间页的 CPU 开销是适中的。在平均情况下,我通常会看到最多 5-20% 的开销(这可能会或可能不会证明定期重建是合理的,因为重建时对工作负载的影响要大得多)
  • 如果您使用查询存储(在 SQL Azure 中默认启用),您可以评估特定索引重建是否对您的性能有明显的帮助。您可以将此作为测试,看看您的工作量是否有所改善,然后再花时间自己构建和管理索引重建操作。
  • 请注意,SQL Azure 中目前没有针对用户工作负载的数据库内资源治理。因此,如果您开始重建索引,最终可能会消耗大量资源并影响您的主要工作负载。当然,您可以尝试安排在非工作时间完成的事情,但对于在世界各地拥有大量客户的应用程序来说,这可能是不可能的。
  • 此外,我会注意到许多客户都有索引重建作业,“因为他们希望更新统计信息”。不必为了重建统计信息而重建索引。在最近的 SQL Server 和 SQL Azure 中,统计更新的算法在更大的表上变得更加激进,并且在客户查询最近插入的数据(自上次统计更新以来)的情况下,我们如何估计基数的模型在以后的兼容性中发生了变化水平。因此,通常情况下,客户甚至根本不需要进行任何手动统计更新。
  • 最后,我会注意到统计数据过时的影响是历史上你会得到计划选择回归。对于重复查询,通过在查询存储上引入自动调整功能(如果发现查询性能与之前的计划相比有很大的回归,则会强制执行之前的计划)减轻了这种影响的很多影响。

我给客户的官方建议是不要为索引重建而烦恼,除非他们有一个 1 层应用程序,他们已经证明了真正的需求(收益大于成本),或者他们是一个 SaaS ISV,他们正在尝试调整工作负载弹性池或多租户数据库设计中的许多数据库/客户,以便他们可以减少其 COGS 或避免在非常大的数据库上耗尽磁盘空间(如前所述)。在我们在平台上拥有的最大客户中,我们有时看到与客户手动进行索引操作的价值,但我们通常不需要定期进行此类操作以“以防万一”。SQL 团队的意图是您根本不需要为此烦恼,您可以只专注于您的应用程序。当然,我们总有一些东西可以添加或改进到我们的自动机制中,因此我完全考虑到单个客户数据库可能需要此类操作的可能性。除了我提到的案例之外,我还没有看到任何我自己,即使这些也很少成为问题。

我希望这能为您提供一些背景信息,以了解为什么尚未在平台中完成此操作 - 与其他紧迫需求相比,我们今天在服务中拥有的绝大多数客户数据库都不是问题。当然,我们会重新审视构建每个计划周期所需的事项清单,并且我们会定期查看此类机会。

祝你好运——无论你的结果如何,我希望这能帮助你做出正确的选择。

此致 Conor Cunningham 架构师,SQL

于 2018-07-28T00:28:15.333 回答
16

您可以使用 Azure 自动化来安排索引维护任务,如下所述:使用 Azure 自动化重建 SQL 数据库索引

以下是步骤:

1) 如果您没有任何自动化帐户,请转至https://portal.azure.com并选择新建 > 管理 > 自动化帐户

在此处输入图像描述

2) 创建自动化帐户后,打开详细信息,现在单击 Runbooks > Browse Gallery

在此处输入图像描述

在搜索框中键入“索引”一词,然后运行手册“如果 Azure 数据库中的表具有高碎片,则为它们编制索引”:

在此处输入图像描述

4) 请注意,Runbook 的作者是 Microsoft 的 SC 自动化产品团队。点击导入:

在此处输入图像描述

5) 导入 Runbook 后,现在让我们将数据库凭据添加到资产。单击资产 > 凭据,然后单击“添加凭据...”按钮。 在此处输入图像描述

6) 设置凭据名称(稍后将在运行手册中使用)、数据库用户名和密码:

在此处输入图像描述

7) 现在再次单击 Runbooks,然后从列表中选择“Update-SQLIndexRunbook”,然后单击“Edit...”按钮。您将能够看到将要执行的 PowerShell 脚本:

在此处输入图像描述

8) 如果要测试脚本,只需单击“测试窗格”按钮,测试窗口就会打开。引入需要的参数,点击开始执行索引重建。如果发生任何错误,则会在结果窗口中记录该错误。请注意,根据数据库和其他参数,这可能需要很长时间才能完成:

在此处输入图像描述

9) 现在返回编辑器,单击“发布”按钮启用运行手册。如果我们单击“开始”,则会出现一个窗口,询问参数。但由于我们要安排此任务,我们将点击“安排”按钮:

在此处输入图像描述

10) 单击计划链接为运行手册创建一个新计划。我已指定每周一次,但这取决于您的工作量以及您的索引如何随着时间的推移增加其碎片。您将需要根据您的需要并通过在执行之间执行初始查询来调整计划:

在此处输入图像描述

11)现在介绍参数和运行设置:

在此处输入图像描述

注意:您可以使用具有不同设置的不同时间表,即为特定桌子设置特定时间表。

这样,你就完成了。请记住根据需要更改日志记录设置:

在此处输入图像描述

于 2018-02-08T10:50:38.630 回答
1
于 2018-02-09T03:56:41.993 回答
0

正如@TheGamiswar建议的那样,添加一个链接服务器,然后创建一个这样的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [LinkedServerName].[RemoteDB].[dbo].[sp_RebuildReorganizIndexes]   
AS  
BEGIN  
    ALTER INDEX PK_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON);
    ALTER INDEX IX_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON); --Nonclustered index

    ALTER INDEX PK_MyTable ON MyTable REORGANIZE;
    ALTER INDEX IX_MyTable ON MyTable REORGANIZE;
END

然后在您的链接服务器上使用“SQL Server 代理”创建新作业和计划:

在此处输入图像描述

有关详细信息,请参阅https://docs.microsoft.com/en-us/sql/ssms/agent/create-a-job?view=sql-server-2017

于 2019-09-09T17:51:05.253 回答
0

您可以考虑使用 Azure 弹性作业代理在一项作业中自动对多个数据库进行 Azure SQL 数据库维护。

在https://azureops.org/articles/automating-azure-sql-database-maintenance-tasks/阅读有关它的更多信息

在此处输入图像描述

于 2021-05-09T03:41:36.963 回答