[英]How to set Azure SQL to rebuild indexes automatically?
在內部部署的 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
我要指出的是,大多數人根本不需要考慮在SQL Azure中重建索引。 是的,B +樹索引可能會碎片化,是的,與完美調整的索引相比,這會導致一些空間開銷和一些CPU開銷。 因此,在某些情況下,我們會與客戶合作重建索引。 (主要方案是當客戶可能用完空間時,目前,由於當前架構,SQL Azure中的磁盤空間有限)。 因此,我將鼓勵您退一步考慮使用SQL Server模型來管理數據庫不是“錯誤的”,但它可能或可能不值得您的努力。
(如果最終需要重建索引,歡迎使用其他海報發布的模型 - 它們通常是編寫腳本任務的好模型。請注意,SQL Azure托管實例也支持SQL Agent,您也可以使用它如果您願意,可以創建作業來編寫腳本維護操作)。
以下是一些可以幫助您確定是否可能成為索引重建候選者的詳細信息:
我給客戶的官方建議是不打擾索引重建,除非他們有一級應用程序,他們已經證明了真正的需求(收益大於成本)或者他們是SaaS ISV他們試圖調整工作量的地方彈性池或多租戶數據庫設計中的許多數據庫/客戶,因此他們可以減少他們的COGS或避免在一個非常大的數據庫上耗盡磁盤空間(如前所述)。 在我們在平台上擁有的最大客戶中,我們有時會看到與客戶手動進行索引操作的價值,但我們通常不需要在我們進行“以防萬一”這種操作的情況下定期工作。 SQL團隊的目的是讓您根本無需擔心這一點,您可以專注於您的應用程序。 當然,我們總是可以在自動機制中添加或改進這些內容,因此我完全允許單個客戶數據庫可能需要此類操作。 除了我提到的案例之外,我沒有見過任何自己,甚至那些也很少成為問題。
我希望這能為您提供一些背景信息,以便了解為什么還沒有在平台上完成 - 對於我們今天服務的絕大多數客戶數據庫而言,與其他迫切需求相比,這只是一個問題。 當然,我們會重新審視構建每個計划周期所需的事項列表,並且我們會定期查看此類機會。
祝你好運 - 無論你的結果如何,我希望這有助於你做出正確的選擇。
此致,Conor Cunningham Architect,SQL
您可以使用Azure自動化來安排索引維護任務,如下所述: 使用Azure自動化重建SQL數據庫索引
以下是步驟:
1)如果您沒有,請提供自動化帳戶,訪問https://portal.azure.com並選擇新建>管理>自動化帳戶
2)創建自動化帳戶后,打開詳細信息,然后單擊Runbook>瀏覽庫
在搜索框中鍵入單詞“indexes”和Runbook“Azure數據庫中的索引表,如果它們具有高碎片”,則會出現:
4)請注意,Runbook的作者是Microsoft的SC自動化產品團隊。 點擊導入:
5)導入Runbook后,現在讓我們將數據庫憑據添加到資產中。 單擊Assets> Credentials,然后單擊“Add a credential ...”按鈕。
6)設置憑據名稱(稍后將在Runbook上使用),數據庫用戶名和密碼:
7)現在再次單擊Runbooks,然后從列表中選擇“Update-SQLIndexRunbook”,並單擊“編輯...”按鈕。 您將能夠看到將要執行的PowerShell腳本:
8)如果要測試腳本,只需單擊“測試窗格”按鈕,即可打開測試窗口。 引入所需的參數,然后單擊Start以執行索引重建。 如果發生任何錯誤,則會在結果窗口中記錄錯誤。 請注意,根據數據庫和其他參數,這可能需要很長時間才能完成:
9)現在返回編輯器,然后單擊“發布”按鈕啟用Runbook。 如果我們點擊“開始”,會出現一個詢問參數的窗口。 但是,由於我們要安排此任務,我們將點擊“計划”按鈕:
10)單擊Schedule鏈接為Runbook創建新的Schedule。 我每周指定一次,但這取決於您的工作量以及索引如何隨着時間的推移而增加碎片。 您需要根據需要調整計划,並在執行之間執行初始查詢:
11)現在介紹參數和運行設置:
注意:您可以使用具有不同設置的不同計划,即具有特定表的特定計划。
有了這個,你已經完成了。 請記住根據需要更改“記錄”設置:
Azure自動化很好,定價也可以忽略不計。
你有其他一些選擇
1.創建一個執行sql任務並通過sql代理安排它。執行sql任務應該包含索引重建代碼和stats rebuild
2.您還可以創建一個鏈接服務器到SQLAZURE並創建一個sql代理作業。要創建一個鏈接服務器到azure,你可以看到這個SO鏈接: 我需要添加一個鏈接服務器到MS Azure SQL Server
正如@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
您可以考慮使用 Azure 彈性作業代理在一項作業中自動對多個數據庫進行 Azure SQL 數據庫維護。
在https://azureops.org/articles/automating-azure-sql-database-maintenance-tasks/閱讀更多相關信息
除了使用Azure自動化在Azure SQL數據庫上自動執行重建索引作業之外,您還可以考慮Azure SQL數據庫中的自動索引管理功能,如此SQL Server數據庫引擎博客中所述 。
您可以通過轉到Azure門戶,轉到Azure SQL數據庫,然后轉到自動調整來執行此操作 。 如果要為特定Azure SQL Server下的所有數據庫啟用此功能,則還可以在Azure SQL Server上啟用相同功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.