Database
 sql >> Datenbank >  >> RDS >> Database

Automatische Indexverwaltung in Azure SQL-Datenbank

Im Februar habe ich einen Blogbeitrag über die automatische Plankorrektur in SQL Server geschrieben, und in diesem Beitrag möchte ich über die automatische Indexverwaltung sprechen, die zweite Komponente der automatischen Optimierungsfunktion. Die automatische Indexverwaltung ist nur in Azure SQL-Datenbank verfügbar und steht derzeit nicht auf der Roadmap, um in der nächsten Version von SQL Server lokal verfügbar zu sein. Diese Option wird unabhängig von der automatischen Plankorrektur aktiviert und verwaltet, wie der Name schon sagt, Indizes in Ihrer Datenbank. Insbesondere kann es fehlende Indizes erstellen und nicht verwendete Indizes sowie Duplikate entfernen. Sehen wir uns an, wie dies geschieht.

Unter der Decke
Das automatische Index-Management stützt sich auf Daten, um seine Entscheidung zu treffen. Für die potenzielle Indexerstellung verwendet es Informationen zum fehlenden Index-DMV und verfolgt sie im Laufe der Zeit und kombiniert diese Daten mit einem internen Modell, um den Nutzen des Index zu bestimmen. Es verwendet auch den Abfragespeicher, um festzustellen, ob der Index Vorteile bietet, daher muss er für die Datenbank aktiviert werden, genau wie bei der automatischen Plankorrektur. Im Hinblick auf das Löschen von Indizes werden Daten aus der Indexnutzungs-DMV (sys.dm_db_index_usage_stats) sowie Indexmetadaten (z. B. Anzahl der Spalten, Spaltendatentypen) verwendet.

Automatische Indexverwaltung aktivieren
Wie bereits erwähnt, muss der Abfragespeicher für die Datenbank aktiviert sein. Dies kann in SSMS, mit T-SQL und mit der REST-API für Azure SQL-Datenbank erfolgen. Beachten Sie, dass der Abfragespeicher standardmäßig für Datenbanken in Azure aktiviert ist, und zwar seit Q4 2016.

USE [master];
GO
ALTER DATABASE [WideWorldImporters] 
	SET QUERY_STORE = ON;
GO
ALTER DATABASE [WideWorldImporters] 
	SET QUERY_STORE (OPERATION_MODE = READ_WRITE);
GO

Sobald der Abfragespeicher aktiviert ist, können Sie das Azure-Portal, T-SQL oder die EST-API verwenden, um die automatische Indexverwaltung in Azure SQL-Datenbank zu aktivieren (C# und PowerShell sind in Arbeit).

ALTER DATABASE [WWI_PS] SET AUTOMATIC_TUNING (CREATE_INDEX = ON, DROP_INDEX = ON);
GO

Die automatische Indexverwaltung wird in naher Zukunft standardmäßig für neue Datenbanken in Azure (https://azure.microsoft.com/en-us/blog/automatic-tuning-will-be-a-new-default/) aktiviert. Ab Januar 2018 hat Microsoft mit der Einführung begonnen, um die automatische Optimierung für Azure SQL-Datenbanken zu aktivieren, die sie noch nicht aktiviert hatten, wobei Benachrichtigungen an Administratoren gesendet wurden, damit die Option bei Bedarf deaktiviert werden kann. Dieser Vorgang dauert mehrere Monate, also keine Panik, falls Sie noch keine Benachrichtigung erhalten haben!

So funktioniert es
Für die Indexerstellung gibt es derzeit ein rollierendes Fenster von sieben (7) Tagen*, in dem die Daten nachverfolgt werden, und das Modell benötigt mindestens neun (9) Stunden* an Daten, um einen Index zu empfehlen mit 12 Stunden* Daten im Abfragespeicher, die als Basis verwendet werden. Wenn festgestellt wird, dass ein Index einen erheblichen Vorteil bietet, erstellt SQL Server den Index.

*Diese Werte können sich in Zukunft ändern, wenn sich das Modell weiterentwickelt.

Hinweis:Derzeit führt das Modell Empfehlungen zusammen. Das heißt, wenn mehrere Indizes für eine Tabelle empfohlen werden, aber ein Index erstellt werden kann, um alle Optionen abzudecken, kann es diesen einen Index derzeit erstellen. Allerdings ist das Modell derzeit nicht intelligent genug, um einen empfohlenen Index mit einem bereits vorhandenen zusammenzuführen.

Nachdem ein Index erstellt wurde, überprüft SQL Server mithilfe des Abfragespeichers, ob er Vorteile bietet (daher muss er für die Datenbank aktiviert werden). Es überwacht die Leistung jeder Abfrage, die den neuen Index verwendet, und vergleicht die CPU der Abfrage vor dem Hinzufügen des Index und bei der Verwendung des Index. Wenn aufgrund des Indexes eine Regression der Abfrageleistung auftritt, wird der Index zurückgesetzt (gelöscht). SQL Server überwacht die Abfrageleistung für bis zu drei (3) Tage oder bis 100 % der relevanten Arbeitslast analysiert wurden. Wenn der Index nach diesem Zeitraum keine Anzeichen einer Regression aufweist, wird die Leistung für ihn nicht erneut überprüft.

Beachten Sie Folgendes:Wenn die automatische Indexverwaltung einen Index erstellt und sich Ihre Arbeitslast zwei Monate später ändert und von demselben Index profitieren würde, der zuvor automatisch erstellt wurde, jedoch mit einer zusätzlichen Spalte, SQL Server derzeit einen neuen Index erstellt. Derzeit gibt es keine Logik, um einen vorhandenen automatisch erstellten Index zu ändern, aber diese Funktionalität steht auf der Roadmap für das Feature.

In Bezug auf das Löschen von Indizes:Wenn ein Index 90 Tage lang nicht gesucht oder gescannt wird, aber Wartungskosten verursacht werden (d. h. es gibt Einfügungen, Aktualisierungen oder Löschungen), wird er gelöscht. Doppelte Indizes werden ebenfalls entfernt, vorausgesetzt, es handelt sich um exakte Duplikate (und das Schema wird verwendet, um festzustellen, ob die Indizes genau gleich sind). Wenn es doppelte Indizes in Bezug auf Schlüsselspalten und eingeschlossene Spalten (falls relevant) gibt, aber einer oder mehrere davon einen Filter haben, dann sind sie nicht wirklich doppelt und es werden keine Indizes gelöscht.

Als Referenz:Es gibt doppelt so viele DROP INDEX-Empfehlungen in Azure SQL-Datenbank wie CREATE INDEX-Empfehlungen.

Wenn Sie die Option DROP INDEX aktivieren, löscht SQL Server vom Benutzer erstellte Indizes. Wenn Sie die CREATE INDEX-Option aktivieren, kann SQL Server Indizes automatisch erstellen und diese Indizes auch löschen (benutzerdefinierte Indizes werden jedoch nicht gelöscht). Schließlich werden Indizes in Zeiten mit geringer Arbeitslast erstellt und gelöscht, wie von DTU festgelegt. Wenn die Arbeitslast über 80 % DTU liegt, wartet SQL Server mit dem Erstellen oder Löschen des Index, bis die Systemlast abnimmt.

Werde ich SQL Server wirklich die Kontrolle überlassen?
Vielleicht. Meine Empfehlung zu dieser Funktion erfordert zunächst einen „Vertrauen, aber überprüfen“-Ansatz.

Wie bei der automatischen Plankorrektur wurde die automatische Indexverwaltung mit einer beträchtlichen Datenmenge entwickelt, die aus fast zwei Millionen Azure SQL-Datenbanken erfasst wurde. Das Feature „Automatische Indexverwaltung“ ist in Azure SQL-Datenbank seit Q1 2016 als Teil von Index Advisor verfügbar.

Die von der Funktion verwendeten Algorithmen haben sich weiterentwickelt und entwickeln sich im Laufe der Zeit weiter, da immer mehr Datenbanken sie verwenden und mehr Daten erfasst und analysiert werden. Allerdings gibt es derzeit einige Einschränkungen.

  1. Indexempfehlungen werden nicht anhand bestehender Indizes bewertet, daher ist eine Indexkonsolidierung zwischen neuen und bestehenden Indizes derzeit nicht verfügbar.
  2. Wenn ein Index Vorteile für ein SELECT bieten würde, ist der Overhead von Änderungen aufgrund von INSERTs, UPDATEs und DELETEs vor der Erstellung nicht bekannt. SQL Server überwacht diesen Overhead während des Überprüfungsprozesses, nachdem der Index implementiert wurde.

Es gibt erwähnenswerte Vorteile der automatischen Indexverwaltung:

  1. Für jeden, der eine SQL Server-Datenbank verwalten muss, aber kein DBA ist, können Indexempfehlungen äußerst hilfreich sein.
  2. Indexempfehlungen werden in der DMV sys.dm_db_tuning_recommendations erfasst, selbst wenn die CREATE- und DROP-Indexoptionen nicht aktiviert sind. Wenn Sie sich also nicht sicher sind, welche Änderungen SQL Server vornehmen könnte, können Sie überprüfen, was in der DMV erfasst wird, und dann eine Entscheidung treffen, die Empfehlung manuell zu implementieren.

    Hinweis:Wenn Sie die Empfehlung manuell implementieren, führt SQL Server keine Überprüfung durch. Wenn Sie die Empfehlung über das Portal (über die Schaltfläche „Übernehmen“) oder die REST-API implementieren, wird sie wie eine automatische Aktion ausgeführt, und es wird eine Validierung durchgeführt (und der Index könnte bei einer Regression automatisch zurückgesetzt werden).

  3. Die Funktion wird weiter verbessert. Wie ich bereits sagte, versucht Microsoft nicht, DBAs oder Entwickler arbeitslos zu codieren, sondern versucht, die tief hängenden Früchte anzugehen, damit Sie mehr Zeit für die Aufgaben und Projekte haben, die nicht intelligent automatisiert werden können. ol>

    Zusammenfassung
    Wenn Sie nicht bereit sind, die Zügel der Indexverwaltung abzugeben, verstehe ich das. Wenn Sie jedoch mindestens über eine Azure SQL-Datenbank verfügen, sollten Sie die DMV sys.dm_db_tuning_recommendations regelmäßig überprüfen, um zu sehen, was SQL Server empfiehlt, und diese Daten mit Daten vergleichen, die Sie oder Ihr Drittanbieter-Überwachungstool möglicherweise über die Indexnutzung erfassen. Wann haben Sie Ihre Indizes schließlich das letzte Mal vollständig und gründlich überprüft, um zu verstehen, was fehlt, was wirklich verwendet wird und was lediglich Overhead in der Datenbank verursacht?