如何设置Azure SQL以自动重建索引?

时间:2018-02-08 08:38:31

标签: sql-server azure azure-sql-database azure-sql-server

在内部部署的SQL数据库中,有一段时间内没有使用那么多的维护计划来重建索引是正常的。

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

PS:我之前尝试过,但由于我无法找到任何选项,我想也许他们会自动执行此操作,直到我阅读this post并尝试:

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

发现我有需要维护的索引 enter image description here

6 个答案:

答案 0 :(得分:9)

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

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

以下一些详细信息可以帮助您确定是否可能进行索引重建:

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

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

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

祝您好运-无论您在这里遇到什么结果,希望这有助于您做出正确的选择。

此致, 康纳·坎宁安(Conor Cunningham) SQL架构师

答案 1 :(得分:6)

您可以使用Azure自动化来安排索引维护任务,如下所述:Rebuilding SQL Database indexes using Azure Automation

以下是步骤:

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

enter image description here

2)创建自动化帐户后,打开详细信息,然后单击Runbooks>浏览图库

enter image description here

在搜索框中键入单词“indexes”和Runbook“Azure数据库中的索引表(如果它们具有高碎片)”:

enter image description here

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

enter image description here

5)导入Runbook后,现在让我们将数据库凭据添加到资产中。点击资产>凭据然后在“添加凭据...”按钮上。 enter image description here

6)设置凭据名称(稍后将在Runbook上使用),数据库用户名和密码:

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

注意:您可以使用具有不同设置的不同计划,即具有特定表格的特定计划。

有了这个,你已经完成了。请记住根据需要更改“记录”设置:

enter image description here

答案 2 :(得分:1)

Azure Automation is good and pricing is also negligible..

enter image description here

中填写范围

您拥有的其他一些选项

1.创建一个执行sql任务并通过sql代理安排它。执行sql任务应该包含索引重建代码和stats rebuild

2.您还可以创建一个到SQLAZURE的链接服务器并创建一个sql代理作业。要创建一个链接服务器到azure,你可以看到这个SO链接:I need to add a linked server to a MS Azure SQL Server

答案 3 :(得分:0)

按照@TheGamiswar的建议,添加一个linked server,然后创建一个存储过程,如下所示:

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代理”创建新作业和计划:

enter image description here

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

答案 4 :(得分:0)

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

https://azureops.org/articles/automating-azure-sql-database-maintenance-tasks/

阅读更多相关信息

enter image description here

答案 5 :(得分:-1)

除了使用Azure自动化在Azure SQL数据库上自动执行重建索引作业之外,您还可以考虑Azure SQL数据库中的自动索引管理功能,如此{{3}中所述}。

您可以通过转到Azure门户,转到Azure SQL数据库,然后自动调整来执行此操作。如果要为特定Azure SQL Server下的所有数据库启用此功能,则还可以在Azure SQL Server上启用相同功能。

SQL Server Database Engine blog