在内部部署的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
答案 0 :(得分:9)
我将指出,大多数人根本不需要考虑在SQL Azure中重建索引。是的,B +树索引可能会碎片化,是的,与具有经过优化的索引相比,这可能会导致一些空间开销和一些CPU开销。因此,在某些情况下,我们与客户合作来重建索引。 (主要方案是客户当前可能会用完空间,因为由于当前体系结构,SQL Azure中的磁盘空间有所限制)。因此,我鼓励您退后一步,并认为使用SQL Server模型管理数据库并不是“错误的”,但是它可能值得也可能不值得您付出努力。
(如果您最终确实需要重建索引,欢迎使用其他张贴者在此处发布的模型-它们通常是脚本任务的良好模型。请注意,SQL Azure托管实例还支持您所使用的SQL Agent如果愿意,也可以用来创建作业以编写维护操作脚本。
以下一些详细信息可以帮助您确定是否可能进行索引重建:
我向客户提供的官方建议是,不要烦恼索引重建,除非他们拥有已证明其实际需求(收益超过成本)的Tier-1应用程序,或者他们正在尝试使用的SaaS ISV调整弹性池或多租户数据库设计中许多数据库/客户的工作负载,以便他们可以减少COGS或避免在大型数据库上耗尽磁盘空间(如前所述)。在平台上拥有的最大客户中,有时 可以看到与客户手动进行索引操作的价值,但我们通常不需要做常规的工作,而仅需“如果”。 SQL团队的意图是,您根本不必为此烦恼,而可以专注于应用程序。当然,总有一些事情可以添加或改进到我们的自动机制中,因此,我完全允许单个客户数据库可能需要执行此类操作。除了我提到的案例,我还没有见过任何我自己的人,即使那些案例也很少成为问题。
我希望这为您提供了一些背景信息,以了解为什么尚未在平台中完成此操作-与其他紧迫的需求相比,对于我们今天服务的绝大多数客户数据库而言,这并不是一个问题。当然,我们会重新审视构建每个计划周期所需的工作清单,并且会定期查看此类机会。
祝您好运-无论您在这里遇到什么结果,希望这有助于您做出正确的选择。
此致, 康纳·坎宁安(Conor Cunningham) SQL架构师
答案 1 :(得分:6)
您可以使用Azure自动化来安排索引维护任务,如下所述:Rebuilding SQL Database indexes using Azure Automation
以下是步骤:
1)如果您没有自动帐户,请设置自动帐户,转到https://portal.azure.com并选择新建>管理>自动化帐户
2)创建自动化帐户后,打开详细信息,然后单击Runbooks>浏览图库
在搜索框中键入单词“indexes”和Runbook“Azure数据库中的索引表(如果它们具有高碎片)”:
4)请注意,Runbook的作者是Microsoft的SC自动化产品团队。单击导入:
5)导入Runbook后,现在让我们将数据库凭据添加到资产中。点击资产>凭据然后在“添加凭据...”按钮上。
6)设置凭据名称(稍后将在Runbook上使用),数据库用户名和密码:
7)现在再次单击Runbooks,然后从列表中选择“Update-SQLIndexRunbook”,并单击“编辑...”按钮。您将能够看到将要执行的PowerShell脚本:
8)如果要测试脚本,只需单击“测试窗格”按钮,即可打开测试窗口。引入所需的参数,然后单击Start以执行索引重建。如果发生任何错误,则会在结果窗口中记录错误。请注意,根据数据库和其他参数,这可能需要很长时间才能完成:
9)现在返回编辑器,然后单击“发布”按钮启用Runbook。如果我们点击“开始”,会出现一个询问参数的窗口。但是,由于我们要安排此任务,我们将点击“计划”按钮:
10)单击Schedule链接为Runbook创建新的Schedule。我每周指定一次,但这取决于您的工作量以及索引如何随着时间的推移而增加碎片。您需要根据需要调整计划,并在执行之间执行初始查询:
11)现在介绍参数和运行设置:
注意:您可以使用具有不同设置的不同计划,即具有特定表格的特定计划。
有了这个,你已经完成了。请记住根据需要更改“记录”设置:
答案 2 :(得分:1)
Azure Automation is good and pricing is also negligible..
中填写范围您拥有的其他一些选项
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代理”创建新作业和计划:
有关详细信息,请参见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/
阅读更多相关信息答案 5 :(得分:-1)
除了使用Azure自动化在Azure SQL数据库上自动执行重建索引作业之外,您还可以考虑Azure SQL数据库中的自动索引管理功能,如此{{3}中所述}。
您可以通过转到Azure门户,转到Azure SQL数据库,然后自动调整来执行此操作。如果要为特定Azure SQL Server下的所有数据库启用此功能,则还可以在Azure SQL Server上启用相同功能。