webentwicklung-frage-antwort-db.com.de

Wie wird Azure SQL so eingestellt, dass Indizes automatisch neu erstellt werden?

In On-Premise-SQL-Datenbanken ist es normal, dass gelegentlich ein Wartungsplan für die Neuerstellung der Indizes erstellt wird, wenn diese nicht so häufig verwendet werden.

Wie kann ich es in Azure SQL DB einrichten?

P.S: Ich habe es vorher versucht, aber da ich keine Optionen dafür gefunden habe, dachte ich, dass sie es vielleicht automatisch tun, bis ich diesen Beitrag gelesen und versucht habe:

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

Und fand heraus, dass ich Indizes habe, die gepflegt werden müssen  enter image description here

4
Ashkan Sirous

Ich möchte darauf hinweisen, dass die meisten Benutzer überhaupt nicht daran denken müssen, Indizes in SQL Azure neu zu erstellen. Ja, B + Tree-Indizes können fragmentiert werden, und dies kann im Vergleich zu perfekt abgestimmten Indizes zu Speicherplatz und CPU-Aufwand führen. Es gibt also einige Szenarien, in denen wir mit Kunden zusammenarbeiten, um Indizes neu zu erstellen. (Das Hauptszenario ist, wenn der Kunde derzeit nicht mehr über genügend Speicherplatz verfügt, da der Speicherplatz in SQL Azure aufgrund der aktuellen Architektur etwas eingeschränkt ist). Daher möchte ich Sie dazu ermutigen, einen Schritt zurückzutreten und zu bedenken, dass die Verwendung des SQL Server-Modells zum Verwalten von Datenbanken nicht "falsch" ist, dass es sich aber möglicherweise Ihren Aufwand lohnt.

(Wenn Sie am Ende einen Index neu erstellen müssen, können Sie gerne die hier von den anderen Postern veröffentlichten Modelle verwenden. Normalerweise handelt es sich dabei um feine Modelle für Skriptaufgaben. Beachten Sie, dass die verwaltete Instanz von SQL Azure auch den SQL-Agent unterstützt, den Sie auch verwenden können (falls Sie dies wünschen), um Jobs für Skriptwartungsvorgänge zu erstellen.

Hier sind einige Details, die Ihnen bei der Entscheidung helfen können, ob Sie ein Kandidat für die Neuerstellung von Indizes sind:

  • Der Link, auf den Sie verwiesen haben, stammt aus einem Beitrag aus dem Jahr 2013. Die Architektur für SQL Azure wurde nach diesem Beitrag komplett neu erstellt. Insbesondere wurde die Hardwarearchitektur von einem Modell, das auf lokalen rotierenden Datenträgern basierte, zu einem Modell verschoben, das auf lokalen SSDs (in den meisten Fällen) basierte. Die Anleitung in der ursprünglichen Post ist also nicht mehr aktuell.
  • In der aktuellen Architektur können Fälle auftreten, in denen der Speicherplatz mit einem fragmentierten Index knapp wird. Sie haben die Möglichkeit, den Index neu aufzubauen oder für eine Weile zu einer größeren Reservierungsgröße zu wechseln (was mehr Geld kostet), die eine größere Speicherplatzzuordnung unterstützt. [Da der lokale SSD-Speicherplatz auf den Maschinen begrenzt ist, hängen die Reservierungsgrößen grob von den Proportionen der Maschine ab. Wenn wir neuere Hardware mit größeren/mehr Laufwerken erhalten, haben Sie mehr Optionen für das Scale-Up.
  • Die Auswirkungen der SSD-Fragmentierung sind im Vergleich zu rotierenden Festplatten relativ gering, da die Kosten einer zufälligen IO nicht wirklich höher sind als die einer sequentiellen. Der CPU-Aufwand für einige weitere B + Tree-Zwischenseiten ist bescheiden. Ich habe in der Regel im Durchschnitt einen Overhead von vielleicht 5-20% max gesehen (was regelmäßige Rebuilds rechtfertigen kann, was beim Rebuild einen wesentlich größeren Einfluss auf die Last hat).
  • Wenn Sie den Abfragespeicher verwenden (der standardmäßig in SQL Azure aktiviert ist), können Sie abschätzen, ob ein bestimmter Indexaufbau die Leistung sichtbar verbessert oder nicht. Sie können dies als Test durchführen, um zu sehen, ob sich Ihre Workload verbessert, bevor Sie sich die Zeit nehmen, um Indexerstellungsvorgänge selbst zu erstellen und zu verwalten.
  • Beachten Sie, dass in SQL Azure derzeit keine datenbankinterne Ressourcensteuerung für Benutzer-Workloads vorliegt. Wenn Sie also einen Index neu erstellen, verbrauchen Sie möglicherweise eine Menge Ressourcen und wirken sich auf Ihre Hauptauslastung aus. Sie können natürlich versuchen, die Zeit außerhalb der Geschäftszeiten festzulegen, aber für Anwendungen mit vielen Kunden auf der ganzen Welt ist dies möglicherweise nicht möglich.
  • Außerdem werde ich feststellen, dass viele Kunden Indexrekonstruktionsjobs haben, "weil sie möchten, dass Statistiken aktualisiert werden". Es ist nicht erforderlich, einen Index neu zu erstellen, nur um die Statistiken neu zu erstellen. In den letzten Versionen von SQL Server und SQL Azure wurde der Algorithmus für die Aktualisierung der Statistiken für größere Tabellen aggressiver gestaltet und das Modell für die Schätzung der Kardinalität in Fällen, in denen Kunden kürzlich eingefügte Daten abfragen (seit der letzten Aktualisierung der Statistiken) aus Gründen der späteren Kompatibilität geändert Ebenen. Daher ist es oft so, dass der Kunde überhaupt keine Aktualisierung der manuellen Statistiken vornehmen muss.
  • Abschließend möchte ich anmerken, dass die Auswirkungen von Statistiken, die nicht mehr aktuell sind, historisch bedingt waren, dass Sie Regressionen mit Planwahl erhalten würden. Bei wiederholten Abfragen wurde die Auswirkung durch die Einführung der automatischen Abstimmungsfunktion gegenüber dem Abfragespeicher erheblich gemindert (was frühere Pläne erzwingt, wenn im Vergleich zum vorherigen Plan eine große Regression bei der Abfrageleistung festgestellt wird). 

Die offizielle Empfehlung, die ich Kunden gebe, ist, sich nicht mit Indexrekonstruktionen zu beschäftigen, es sei denn, sie verfügen über eine Tier-1-App, bei der sie einen echten Bedarf gezeigt haben (der Nutzen überwiegt die Kosten) oder sie sind ein SaaS ISV, bei dem sie es versuchen Um eine Arbeitslast für viele Datenbanken/Kunden in elastischen Pools oder in einem Multi-Tenant-Datenbankdesign zu optimieren, können sie ihre COGS reduzieren oder verhindern, dass auf einer sehr großen Datenbank (wie zuvor erwähnt) nicht genügend Speicherplatz zur Verfügung steht. Bei den größten Kunden, die wir auf der Plattform haben, sehen wir manchmal es wert, Indexoperationen manuell mit dem Kunden durchzuführen, aber wir brauchen oft keine reguläre Arbeit, bei der wir diese Art von Operation "nur für den Fall" durchführen. . Die Absicht des SQL-Teams besteht darin, dass Sie sich nicht darum kümmern müssen und sich stattdessen auf Ihre App konzentrieren können. Natürlich gibt es immer Dinge, die wir in unsere automatischen Mechanismen einbauen oder verbessern können, so dass ich völlig die Möglichkeit berücksichtige, dass eine individuelle Kundendatenbank solche Aktionen benötigt. Ich habe über die von mir genannten Fälle hinaus keine eigenen gesehen, und selbst diese sind selten ein Thema.

Ich hoffe, dies gibt Ihnen einen Kontext, um zu verstehen, warum dies auf der Plattform noch nicht erfolgt ist - für die große Mehrheit der Kundendatenbanken, die wir heute in unserem Service haben, war dies im Vergleich zu anderen dringenden Bedürfnissen einfach kein Problem. Natürlich gehen wir die Liste der Dinge, die wir für jeden Planungszyklus aufbauen müssen, noch einmal durch, und wir schauen uns regelmäßig solche Möglichkeiten an.

Viel Glück - was auch immer Ihr Ergebnis hier ist, ich hoffe, es hilft Ihnen dabei, die richtige Wahl zu treffen.

Mit freundlichen Grüßen Conor Cunningham Architekt, SQL

Sie können Azure Automation zum Planen von Indexwartungsaufgaben verwenden, wie hier erläutert: Wiederherstellen von SQL-Datenbankindizes mithilfe von Azure Automation

Nachfolgend sind Schritte aufgeführt:

1) Stellen Sie ein Automatisierungskonto bereit, falls Sie noch kein Konto haben. Gehen Sie zu https://portal.Azure.com und wählen Sie Neu> Management> Automatisierungskonto 

 enter image description here

2) Öffnen Sie nach dem Erstellen des Automatisierungskontos die Details und klicken Sie auf Runbooks> Galerie durchsuchen

 enter image description here

Geben Sie in das Suchfeld die Word- "Indizes" und das Runbook "Tabellen in einer Azure-Datenbank indizieren, wenn diese eine hohe Fragmentierung aufweisen" an:

 enter image description here

4) Beachten Sie, dass der Autor des Runbooks das SC Automation Product Team bei Microsoft ist. Klicken Sie auf Importieren:

 enter image description here

5) Nach dem Importieren des Runbooks fügen wir nun die Datenbankanmeldeinformationen zu den Assets hinzu. Klicken Sie auf Assets> Credentials und dann auf die Schaltfläche "Credential hinzufügen ...".  enter image description here

6) Legen Sie einen Anmeldeinformationsnamen (der später im Runbook verwendet wird), den Datenbankbenutzernamen und das Kennwort fest:

 enter image description here

7) Klicken Sie nun erneut auf Runbooks und wählen Sie dann "Update-SQLIndexRunbook" aus der Liste aus und klicken Sie auf die Schaltfläche "Bearbeiten". Sie können das ausgeführte PowerShell-Skript sehen: 

 enter image description here

8) Wenn Sie das Skript testen möchten, klicken Sie einfach auf die Schaltfläche "Test Pane", und das Testfenster wird geöffnet. Geben Sie die erforderlichen Parameter ein und klicken Sie auf Start, um die Indexwiederherstellung auszuführen. Wenn ein Fehler auftritt, wird der Fehler im Ergebnisfenster protokolliert. Beachten Sie, dass dies abhängig von der Datenbank und den anderen Parametern lange dauern kann:

 enter image description here

9) Gehen Sie nun zurück zum Editor und klicken Sie auf die Schaltfläche "Veröffentlichen", um das Runbook zu aktivieren. Wenn wir auf “Start” klicken, erscheint ein Fenster, in dem Sie nach den Parametern gefragt werden. Da wir diese Aufgabe planen möchten, klicken wir stattdessen auf die Schaltfläche "Zeitplan":

 enter image description here

10) Klicken Sie auf den Link Schedule, um einen neuen Schedule für das Runbook zu erstellen. Ich habe einmal pro Woche angegeben, aber das hängt von Ihrer Arbeitslast und davon ab, wie Ihre Indizes ihre Fragmentierung im Laufe der Zeit erhöhen. Sie müssen den Zeitplan an Ihre Bedürfnisse anpassen und die ersten Abfragen zwischen den Ausführungen ausführen: 

 enter image description here

11) Führen Sie nun die Parameter und Laufeinstellungen ein:

 enter image description here

HINWEIS: Sie können mit unterschiedlichen Zeitplänen mit unterschiedlichen Einstellungen spielen, d. H. Mit einem bestimmten Zeitplan für eine bestimmte Tabelle.

Damit sind Sie fertig. Denken Sie daran, die Protokolleinstellungen wie gewünscht zu ändern:

 enter image description here

6
Alberto Morillo

Azure Automation ist gut und die Preise sind auch vernachlässigbar.

 enter image description here

Einige andere Optionen, die Sie haben, sind

1.Erstellen Sie eine SQL-Task zum Ausführen und planen Sie sie über den SQL-Agent. Der SQL-Task für die Ausführung sollte den Code für die Indexregenerierung zusammen mit der Statistik für die Statistiken enthalten 

2.Sie können auch einen Verbindungsserver für SQLAZURE erstellen und einen SQL-Agentenjob erstellen. Um einen Verbindungsserver für Azure zu erstellen, können Sie diesen SO link sehen: Ich muss einen Verbindungsserver zu einem hinzufügen MS Azure SQL Server

1
TheGameiswar

Fügen Sie als @ TheGamiswar einen Verbindungsserver hinzu und erstellen Sie dann eine gespeicherte Prozedur wie diese:

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

Verwenden Sie dann auf Ihrem Verbindungsserver "SQL Server Agent", um einen neuen Auftrag und einen Zeitplan zu erstellen:

enter image description here

Weitere Informationen finden Sie unter https://docs.Microsoft.com/en-us/sql/ssms/agent/create-a-job?view=sql-server-2017

0
user8128167