Azure sql database 在创建新索引时防止DTU耗尽

Azure sql database 在创建新索引时防止DTU耗尽,azure-sql-database,Azure Sql Database,我们使用Azure SQL作为单一数据库,并采用DTU定价模型。我们有一个大约有50万条记录的表,我们想在单个字符串属性上添加一个新的非聚集索引 问题是这是一个生产数据库。如果我使用 CREATE NONCLUSTERED INDEX [IndexName] ON [dbo].[TableName]([FieldName] ASC); GO 索引的创建将使DTU在几分钟内保持在100%,这实际上会使应用程序代码中的任何查询都无法使用 Azure SQL中是否有方法指示SQL Server“嘿,

我们使用Azure SQL作为单一数据库,并采用DTU定价模型。我们有一个大约有50万条记录的表,我们想在单个字符串属性上添加一个新的非聚集索引

问题是这是一个生产数据库。如果我使用

CREATE NONCLUSTERED INDEX [IndexName]
ON [dbo].[TableName]([FieldName] ASC);
GO
索引的创建将使DTU在几分钟内保持在100%,这实际上会使应用程序代码中的任何查询都无法使用

Azure SQL中是否有方法指示SQL Server“嘿,仅使用X DTU进行此索引操作”?

您可以使用选项来限制使用的处理器数量

ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE=ON, MAXDOP=1, RESUMABLE=ON) ;

你可以考虑使用可恢复的在线索引重建功能,这样你就可以对这些索引执行一分钟的X执行。

ALTER INDEX [ix_CustomerIDs]
ON [ContosoSales].[ConstosoTransactionData]
REBUILD
WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 1 MINUTES);
GO

ALTER INDEX ix_CustomerIDs ON [ContosoSales].[ConstosoTransactionData] PAUSE

ALTER INDEX ix_CustomerIDs ON [ContosoSales].[ConstosoTransactionData] RESUME

还可以考虑临时扩展以进行部署并在以后缩减规模。不幸的是,在服务层之间进行扩展时,存在一个不可用的窗口,这使得该策略对于真正的大型数据库来说不切实际。此外,更多的DTU只意味着有更多的能力来执行索引,但DTU仍将达到100%。这只会缩短不可用窗口。“…但DTU仍将达到100%”-您尝试过这个吗?您的普通DTU(和层)是什么,您尝试了什么?这是有用的诊断信息!例如,我发现很难相信在标准S0上构建的索引也会在S3上使用平面DTU,但也许您已经尝试过了。可能值得一提的是,文档中有一个界限:“重要。标准S0、S1和S2层提供的vCore(CPU)少于一个。对于CPU密集型工作负载,建议使用S3或更高级别的服务层。”这就是我想说的——有意义吗?这里引用上面的话:哦,是的——在对生产数据库进行任何重大更改之前,我们会创建一个副本,并通过脚本测试我们的更改。S7 800 DTU实例上具有约5000万行的表中的uniqueidentifier属性的索引将DTU固定在100%,持续四分钟,而没有其他查询在数据库上交互。谢谢!在DTU定价模型下,我不知道有多少CPU分配给我的SQL Server实例,因为底层硬件对我们是隐藏的。使用MAXDOP是否只是DTU模型下关于消耗多少DTU的“试错”设置?使用MAXDOP=1。这是您可以使用的最低CPU资源量。我在一个800 DTU Azure SQL实例上运行了相同的“with(MAXDOP=1,ONLINE=ON)”实验,该实例是生产环境的副本。在索引操作期间,没有其他查询与数据库交互。索引操作的查询完成时间延长到11:45,DTU仍然接近100%。因此,MAXDOP=1似乎不足以防止800 DTU时DTU耗尽。我在这里报告这一点,以防其他人遇到同样的问题。同时使用这些参数(联机=打开,可恢复=打开,最大持续时间=1分钟),然后使用恢复一分钟或两分钟。暂停并恢复6次。在暂停和恢复之间留出几分钟时间,以减少影响。