簡體   English   中英

如何設置 Azure SQL 自動重建索引?

[英]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,您也可以使用它如果您願意,可以創建作業來編寫腳本維護操作)。

以下是一些可以幫助您確定是否可能成為索引重建候選者的詳細信息:

  • 您引用的鏈接來自2013年的帖子。在該帖子之后,SQL Azure的體系結構完全重做。 具體而言,硬件架構從基於本地旋轉磁盤的模型轉移到基於本地SSD的模型(在大多數情況下)。 因此,原帖中的指導已過時。
  • 您可以在當前體系結構中使用碎片索引耗盡空間。 您可以選擇重建索引或移動到更大的預留大小一段時間(這將花費更多的錢),支持更大的磁盤空間分配。 [由於機器上的本地SSD空間有限,預訂大小大致與機器的比例相關聯。 隨着我們獲得具有更大/更多驅動器的更新硬件,您可以獲得更多擴展選項]。
  • 與旋轉磁盤相比,SSD碎片影響相對較低,因為隨機IO的成本實際上並不高於順序IO。 走幾個B + Tree中間頁面的CPU開銷是適度的。 我經常看到平均情況下最多可能增加5-20%的開銷(這可能會或可能不會證明在重建時會對工作負載產生更大影響的常規重建)
  • 如果您使用的是查詢存儲(默認情況下在SQL Azure中啟用),則可以評估特定索引重建是否有助於您的性能可見。 您可以執行此操作作為測試,以查看您的工作負載是否有所改善,然后自己花費時間來構建和管理索引重建操作。
  • 請注意,SQL Azure中目前沒有用於用戶工作負載的數據庫內資源治理。 因此,如果啟動索引重建,最終可能會消耗大量資源並影響主要工作負載。 當然,你可以嘗試在非工作時間完成工作,但對於世界各地許多客戶的應用,這可能是不可能的。
  • 此外,我會注意到許多客戶都有索引重建作業“因為他們希望更新統計信息”。 沒有必要重建索引只是為了重建統計數據。 在最近的SQL Server和SQL Azure中,統計信息更新的算法在較大的表上更加激進,而在客戶查詢最近插入的數據(自上次統計信息更新以來)的情況下我們估算基數的模型在以后的兼容性中已經更改水平。 因此,通常情況是客戶甚至根本不需要進行任何手動統計更新。
  • 最后,我會注意到統計數據過時的影響在歷史上是你會得到計划選擇回歸。 對於重復查詢,通過在查詢存儲上引入自動調整功能(如果它注意到查詢性能與先前計划相比大幅回歸,則會強制執行先前計划)可以減輕此問題的影響。

我給客戶的官方建議是不打擾索引重建,除非他們有一級應用程序,他們已經證明了真正的需求(收益大於成本)或者他們是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM