Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Der in SQL Server nach der Migration ausgeführte Schritt ist entscheidend für die Abstimmung eventueller Datenungenauigkeiten, die Überprüfung der Vollständigkeit und das Beheben von Leistungsproblemen der Workload.
Allgemeine Leistungsszenarios
Im Folgenden sind einige der häufigsten Leistungsszenarios aufgelistet, die nach der Migration zur SQL Server-Plattform auftreten, und wie sie behoben werden können. Hierzu gehören auch Szenarios, die für die Migration von älteren SQL Server-Versionen zu neueren sowie für die Migration von Drittanbieterplattformen (z. B. Oracle, DB2, MySQL und Sybase) zu SQL Server spezifisch sind.
Abfrageregressionen aufgrund einer Änderung in der Version der Kardinalitätsschätzun (CE)
Gilt für: Migration von älteren SQL Server-Versionen zu neueren.
Wenn Sie von einer älteren SQL Server-Version zu SQL Server 2014 (12.x) oder höheren Versionen migrieren und ein Upgrade auf den aktuellen Datenbank-Kompatibilitätsgrad durchführen, können bei einer Workload womöglich Leistungseinbußen auftreten.
Dies liegt daran, dass seit SQL Server 2014 (12.x) alle Änderungen des Abfrageoptimierers an den neuesten Datenbank-Kompatibilitätsgrad gebunden sind, sodass Pläne nicht sofort im Moment des Upgrades geändert werden, sondern erst, wenn ein Benutzer die Datenbankoption COMPATIBILITY_LEVEL auf den neusten Stand aktualisiert. Diese Möglichkeit gibt Ihnen in Kombination mit dem Abfragespeicher ein großes Maß an Kontrolle über die Abfrageleistung im Upgradeprozess.
Weitere Informationen zu Änderungen des Abfrageoptimierers, der in SQL Server 2014 (12.x) eingeführt wurde, finden Sie unter Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator (Optimieren Ihrer Abfragepläne mit der Kardinalitätsschätzung von SQL Server 2014).
Weitere Informationen zu CE finden Sie unter Kardinalitätsschätzung (SQL Server).
Schritte zum Beheben
Ändern Sie den Datenbank-Kompatibilitätsgrad auf die Quellversion, und befolgen Sie den empfohlenen Upgradeworkflow wie in folgendem Bild gezeigt:
Weitere Informationen zu diesem Artikel finden Sie unter Aufrechterhalten einer stabilen Leistung während des Upgrades auf SQL Server 2016.
Sensitivität für die Parameterermittlung
Gilt für: Migration von Drittanbieterplattformen (z. B. Oracle, DB2, MySQL und Sybase) zu SQL Server.
Hinweis
Für SQL Server-zu SQL Server-Migrationen wird dieses Szenario nicht behoben, wenn dieses Problem in der SQL Server-Quelle vorhanden ist, wenn die Migration zu einer neueren Version von SQL Server as-is nicht behoben ist.
SQL Server kompiliert Abfragepläne in gespeicherten Prozeduren, indem die Eingabeparameter bei der ersten Kompilierung ermittelt werden. Anschließend wird ein parametrisierter und wiederverwendbarer Plan generiert, der für diese Verteilung von Eingabedaten optimiert ist. Die meisten Anweisungen, die triviale Pläne generieren, werden parametrisiert, wenn auch nicht in gespeicherten Prozeduren. Nachdem Sie ein Plan zuerst zwischengespeichert wird, wird jede spätere Ausführung einem zuvor zwischengespeicherten Plan zugeordnet.
Ein mögliches Problem tritt auf, wenn diese erste Kompilierung möglicherweise nicht die am häufigsten verwendeten Parametersätze für die übliche Arbeitsauslastung verwendet hat. Bei anderen Parametern wird derselbe Ausführungsplans ineffizient. Weitere Informationen zu diesem Artikel finden Sie unter Parameterempfindlichkeit.
Schritte zum Beheben
Verwenden Sie den
RECOMPILE-Hinweis. Ein Plan wird jedes Mal je nach Parameterwert berechnet.Schreiben Sie die gespeicherte Prozedur neu, sodass die Option
(OPTIMIZE FOR(<input parameter> = <value>))verwendet wird. Entscheiden Sie, welcher Wert verwendet werden soll, der die am besten zu den meisten der relevanten Arbeitsauslastungen passt und einen Plan erstellt und verwaltet, der für die parametrisierten Werte effizient wird.Schreiben Sie die gespeicherten Prozeduren mithilfe der lokalen Variablen innerhalb der Prozedur neu. Nun verwendet der Optimierer den Dichtevektor für Einschätzungen, was zu dem gleichen Plan führt, unabhängig vom Parameterwert.
Schreiben Sie die gespeicherte Prozedur neu, sodass die Option
(OPTIMIZE FOR UNKNOWN)verwendet wird. Dies hat dieselbe Wirkung wie die Verwendung der lokalen Variablen.Schreiben Sie die Abfrage neu, sodass der Hinweis
DISABLE_PARAMETER_SNIFFINGverwendet wird. Dies hat denselben Effekt wie die Verwendung der lokalen Variablen: Die Parameterermittlung wird vollständig deaktiviert, es sei denn,OPTION(RECOMPILE),WITH RECOMPILEoderOPTIMIZE FOR <value>wird verwendet.
Tipp
Nutzen Sie die Vorteile der Management Studio-Plananalyse, um schnell zu ermitteln, ob es sich um ein Problem handelt. Weitere Informationen finden Sie unter "Neu" in SSMS: Problembehandlung zur Abfrageleistung, die einfacher gemacht wurde.
Fehlende Indizes
Gilt für: Migration von Drittanbieterplattformen (z. B. Oracle, DB2, MySQL und Sybase) und SQL Server zu SQL Server.
Falsche oder fehlende Indizes führt zu zusätzlicher Eingabe/Ausgabe, wegen der zusätzlicher Arbeitsspeicher und CPU verschwendet wird. Dies kann daran liegen, dass das Arbeitsauslastungsprofil geändert wurde, also z.B. die Verwendung anderer Prädikate, die den vorhandenen Indexentwurf ungültig machen. Anzeichen einer schlechten Indizierungsstrategie oder Änderungen am Arbeitsauslastungsprofil sind z.B. folgende:
- Doppelte, redundante, selten verwendete und vollständig nicht verwendete Indizes
- Nicht verwendete Indizes mit Updates. Dabei ist besondere Sorgfalt geboten.
Schritte zum Beheben
Verwenden Sie den grafischen Ausführungsplan für alle fehlenden Indexreferenzen.
Indizieren Sie generierte Vorschläge mit dem Datenbankoptimierungsratgeber.
Verwenden Sie die sys.dm_db_missing_index_details.
Verwenden Sie bereits vorhandene Skripts, die vorhandene DMVs verwenden können, um Einblicke in fehlende, duplizierte, redundante, selten verwendete und vollständig nicht verwendete Indizes zu erhalten, aber auch wenn ein Indexverweis in vorhandene Prozeduren und Funktionen in Ihrer Datenbank angedeutet/hartcodiert ist.
Tipp
Beispiele für solche vorhandenen Skripts sind Indexerstellung und Indexinformationen.
Unmöglichkeit, mit Prädikaten Daten zu filtern
Gilt für: Migration von Drittanbieterplattformen (z. B. Oracle, DB2, MySQL und Sybase) und SQL Server zu SQL Server.
Hinweis
Für SQL Server-zu SQL Server-Migrationen wird dieses Szenario nicht behoben, wenn dieses Problem in der SQL Server-Quelle vorhanden ist, wenn die Migration zu einer neueren Version von SQL Server as-is nicht behoben ist.
Der SQL Server-Abfrageoptimierer kann nur Informationen berücksichtigen, die zur Kompilierzeit bekannt sind. Wenn eine Arbeitsauslastung Prädikate nutzt, die nur zum Zeitpunkt der Ausführung bekannt sein können, erhöht sich das Risiko einer schlechten Planauswahl. Für einen besseren Plan müssen Prädikate SARGable sein.
Hinweis
Der Begriff SARGable in relationalen Datenbanken bezieht sich auf ein SarchARGumentfähiges Prädikat, das einen Index verwenden kann, um die Ausführung der Abfrage zu beschleunigen. Weitere Informationen finden Sie in der SQL Server- und Azure SQL-Indexarchitektur und im Entwurfshandbuch.
Einige Beispiele für nicht SARGable Prädikate:
Implizite Datenkonvertierungen wie varchar zu nvarchar oder int zu varchar. Suchen Sie in den tatsächlichen Ausführungsplänen nach
CONVERT_IMPLICIT-Laufzeitwarnungen. Das Konvertieren von einem Typ in einen anderen kann auch zu einem Genauigkeitsverlust führen.Komplexe unbestimmte Ausdrücke wie
WHERE UnitPrice + 1 < 3.975, aber nichtWHERE UnitPrice < 320 * 200 * 32.Ausdrücke mit Funktionen wie
WHERE ABS(ProductID) = 771oderWHERE UPPER(LastName) = 'Smith'Zeichenfolgen mit einem führenden Platzhalterzeichen wie
WHERE LastName LIKE '%Smith', aber nichtWHERE LastName LIKE 'Smith%'
Schritte zum Beheben
Deklarieren Sie Variablen/Parameter immer als vorgesehenen Zieldatentyp.
Dies kann ein Vergleich von benutzerdefinierten Codekonstrukten umfassen, die in der Datenbank (z. B. gespeicherte Prozeduren, benutzerdefinierte Funktionen oder Ansichten) gespeichert sind, mit Systemtabellen, die Informationen zu Datentypen enthalten, die in zugrunde liegenden Tabellen (z. B. sys.columns) verwendet werden.
Wenn der gesamte Code nicht bis zum vorherigen Punkt durchsucht werden kann, ändern Sie zum gleichen Zweck den Datentyp für die Tabelle entsprechend einer Variablen-/Parameterdeklaration.
Gründe für die Nützlichkeit der folgenden Konstrukte:
- Funktionen werden als Prädikate verwendet
- Platzhaltersuchen
- Komplexe Ausdrücke auf Grundlage von spaltenbasierten Daten. Bewerten Sie die Notwendigkeit, stattdessen persistente berechnete Spalten zu erstellen, die indiziert werden können
Hinweis
Alles, was oben aufgeführt ist, kann programmgesteuert ausgeführt werden.
Verwendung von Tabellenwertfunktionen (Funktionen mit mehreren Anweisungen oder Inlinefunktionen)
Gilt für: Migration von Drittanbieterplattformen (z. B. Oracle, DB2, MySQL und Sybase) und SQL Server zu SQL Server.
Hinweis
Für SQL Server-zu SQL Server-Migrationen wird dieses Szenario nicht behoben, wenn dieses Problem in der SQL Server-Quelle vorhanden ist, wenn die Migration zu einer neueren Version von SQL Server as-is nicht behoben ist.
Tabellenwertfunktionen geben einen table-Datentyp zurück, der eine Alternative zu Ansichten sein kann. Ansichten sind auf eine einzelne SELECT-Anweisung beschränkt, während benutzerdefinierte Funktionen zusätzliche Anweisungen enthalten können, die mehr Logik als ansichten ermöglichen.
Da die Ausgabetabelle einer mehrwertigen Tabellenfunktion (MSTVF) zur Kompilierungszeit nicht erstellt wird, basiert der SQL Server-Abfrageoptimierer auf Heuristiken und nicht auf tatsächlichen Statistiken, um Zeilenschätzungen zu bestimmen.
Auch wenn Indizes zu den Basistabellen hinzugefügt werden, wird dies nicht hilfreich sein.
Für MSTVFs verwendet SQL Server eine feste Schätzung von 1 für die Anzahl der Zeilen, die erwartungsgemäß von einem MSTVF zurückgegeben werden sollen (ab SQL Server 2014 (12.x) beträgt diese feste Schätzung 100 Zeilen).
Schritte zum Beheben
Wenn es sich bei der MSTVF-Anweisung nur um eine einzelne Anweisung handelt, konvertieren Sie sie in eine Inline-Tabellenwertfunktion.
CREATE FUNCTION dbo.tfnGetRecentAddress (@ID INT) RETURNS @tblAddress TABLE ([Address] VARCHAR (60) NOT NULL) AS BEGIN INSERT INTO @tblAddress ([Address]) SELECT TOP 1 [AddressLine1] FROM [Person].[Address] WHERE AddressID = @ID ORDER BY [ModifiedDate] DESC; RETURN; ENDEs folgt das Beispiel für das Inline-Format.
CREATE FUNCTION dbo.tfnGetRecentAddress_inline (@ID INT) RETURNS TABLE AS RETURN (SELECT TOP 1 [AddressLine1] AS [Address] FROM [Person].[Address] WHERE AddressID = @ID ORDER BY [ModifiedDate] DESC)Wenn sie komplexer ist, sollten Sie die Zwischenergebnisse verwenden, die in speicheroptimierten Tabellen oder in temporären Tabellen gespeichert sind.
Zugehöriger Inhalt
- Bewährte Methoden für die Überwachung von Workloads mit Abfragespeicher
- Beispieldatenbank für In-Memory OLTP
- Benutzerdefinierte Funktionen
- Table Variables and Row Estimations - Part 1 (Tabellenvariablen und Zeilenschätzungen – Teil 1)
- Table Variables and Row Estimations - Part 1 (Tabellenvariablen und Zeilenschätzungen – Teil 2)
- Zwischenspeichern und Wiederverwenden von Ausführungsplänen