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

Sql server 如何设置Azure SQL以自动重建索引?,sql-server,azure,azure-sql-database,azure-sql-server,Sql Server,Azure,Azure Sql Database,Azure Sql Server,在本地SQL数据库中,通常会有一个维护计划,以便在不经常使用的情况下偶尔重建索引 如何在Azure SQL DB中设置它 注:我以前试过,但由于我找不到任何选项,我想他们可能会自动执行,直到我阅读并尝试: 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

在本地SQL数据库中,通常会有一个维护计划,以便在不经常使用的情况下偶尔重建索引

如何在Azure SQL DB中设置它

注:我以前试过,但由于我找不到任何选项,我想他们可能会自动执行,直到我阅读并尝试:

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
发现我有需要维护的索引

您可以使用Azure Automation来安排索引维护任务,如下所述:

以下是步骤:

1) 如果您没有任何自动化帐户,请转到并选择新建>管理>自动化帐户,以设置自动化帐户

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

在搜索框中键入单词“indexes”和runbook“indexes tables in a Azure database in a high fragmentation in a Azure database”(如果它们具有高碎片),则会显示:

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

5) 导入runbook之后,现在让我们将数据库凭据添加到资产中。单击资产>凭证,然后单击“添加凭证…”按钮。

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

7) 现在再次单击Runbook,然后从列表中选择“更新SQLIndexRunbook”,然后单击“编辑…”按钮。您将能够看到将执行的PowerShell脚本:

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

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

10) 单击计划链接为runbook创建新的计划。我每周指定一次,但这取决于您的工作负载以及索引如何随时间增加碎片。您需要根据自己的需要,通过在执行之间执行初始查询来调整计划:

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

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

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


< P>除了使用Azure AutoCAD对Azure SQL数据库中的重构索引作业进行自动化之外,还可以考虑Azure SQL数据库中的<强>自动索引管理< /强>特性,如本文所描述的。 您可以通过转到Azure门户,转到Azure SQL数据库,然后自动调整来完成此操作。如果希望为特定Azure SQL Server下的所有数据库启用此功能,也可以在Azure SQL Server上启用此功能


Azure自动化很好,价格也可以忽略不计

你还有其他一些选择

1.创建一个执行sql任务,并通过sql代理对其进行调度。执行sql任务应包含索引重建代码以及统计重建


2.您还可以创建到SQLAZURE的链接服务器并创建sql代理作业。要创建到azure的链接服务器,您可以看到以下SO链接:

更新:请注意,工程团队已发布更新的指南,以更好地将此答案中的一些建议编成更“正式”的形式来自Microsoft place,因为一些客户要求。谢谢,康纳

原始答复:

我会指出,大多数人根本不需要考虑在SQL Azure中重建索引。是的,B+树索引可能会变得支离破碎,与完全优化的索引相比,这可能会导致一些空间开销和一些CPU开销。因此,在一些场景中,我们确实与客户一起重建索引。(主要场景是客户当前可能会耗尽空间,因为SQL Azure中的磁盘空间由于当前体系结构而受到一定限制)。因此,我将鼓励你退后一步,考虑使用SQL Server模型来管理数据库并不是“错误的”,但它可能或不值得你付出努力。 (如果您最终需要重建索引,欢迎您使用其他海报在此处发布的模型-它们通常是编写任务脚本的良好模型。请注意,SQL Azure托管实例还支持SQL代理,如果您选择,您还可以使用该代理创建作业来编写维护操作脚本)

以下是一些详细信息,可以帮助您决定是否可以作为索引重建的候选对象:

  • 您引用的链接来自2013年的一篇文章。在那篇文章之后,sqlazure的架构被完全重做了。具体来说,硬件体系结构从基于本地旋转磁盘的模型转变为基于本地SSD的模型(在大多数情况下)。所以,原来帖子里的指导已经过时了
  • 在当前体系结构中,可能会出现这样的情况,即索引碎片会耗尽空间。您可以选择重建索引,或者暂时移动到更大的保留大小(这将花费更多的钱),以支持更大的磁盘空间分配。[由于机器上的本地SSD空间有限,因此保留大小大致与机器的比例有关。随着我们获得更大/更多驱动器的更新硬件,您的规模将更大
    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