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.
Tipps zum Implementieren von Transaktionen mit dediziertem SQL-Pool in Azure Synapse Analytics für die Entwicklung von Lösungen.
Was dich erwartet
Wie Sie erwarten würden, unterstützt dedizierte SQL-Pool Transaktionen als Teil der Data Warehouse-Workload. Um jedoch sicherzustellen, dass die Leistung des dedizierten SQL-Pools im Großen und Umfang beibehalten wird, sind einige Features im Vergleich zu SQL Server eingeschränkt. In diesem Artikel werden die Unterschiede hervorgehoben und die anderen aufgeführt.
Transaktionsisolationsstufen
Dedizierter SQL-Pool implementiert ACID-Transaktionen. Die Isolationsebene der Transaktionsunterstützung ist standardmäßig auf READ UNCOMMITTED festgelegt. Sie können es in READ COMMITTED SNAPSHOT ISOLATION ändern, durch das Aktivieren der Datenbankoption READ_COMMITTED_SNAPSHOT für eine Benutzerdatenbank, wenn Sie mit der Masterdatenbank verbunden sind.
Nach der Aktivierung werden alle Transaktionen in dieser Datenbank unter READ COMMITTED SNAPSHOT ISOLATION ausgeführt, und das Festlegen von READ UNCOMMITTED auf Sitzungsebene wird nicht berücksichtigt. Details finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL ).
Transaktionsgröße
Eine einzelne Datenänderungstransaktion ist in der Größe begrenzt. Der Grenzwert wird pro Verteilung angewendet. Daher kann die Gesamtzuteilung durch Multiplizieren des Grenzwerts mit der Verteilungsanzahl berechnet werden.
Um die maximale Anzahl von Zeilen in der Transaktion anzunähern, dividieren Sie die Verteilungsgrenze durch die Gesamtgröße jeder Zeile. Bei Spalten mit variabler Länge sollten Sie eine durchschnittliche Spaltenlänge verwenden, anstatt die maximale Größe zu verwenden.
In der Tabelle unten sind die folgenden Annahmen gemacht worden:
- Eine gleichmäßige Verteilung von Daten ist aufgetreten.
- Die durchschnittliche Zeilenlänge beträgt 250 Bytes.
Gen2
| DWU | Obergrenze pro Verteilung (GB) | Anzahl der Verteilungen | MAX Transaktionsgröße (GB) | # Zeilen pro Verteilung | Max. Zeilen pro Transaktion |
|---|---|---|---|---|---|
| DW100c | 1 | 60 | 60 | 4,000,000 | 240,000,000 |
| DW200c | 1.5 | 60 | 90 | 6,000,000 | 360.000.000 |
| DW300c | 2,25 | 60 | 135 | 9,000,000 | 540,000,000 |
| DW400c | 3 | 60 | 180 | 12,000,000 | 720,000,000 |
| DW500c | 3,75 | 60 | 225 | 15.000.000 | 900,000,000 |
| DW1000c | 7,5 | 60 | 450 | 30,000,000 | 1,800,000,000 |
| DW1500c | 11.25 | 60 | 675 | 45,000,000 | 2,700,000,000 |
| DW2000c | 15 | 60 | 900 | 60.000.000 | 3,600,000,000 |
| DW2500c | 18.75 | 60 | 1125 | 75,000,000 | 4,500,000,000 |
| DW3000c | 22,5 | 60 | 1,350 | 90.000.000 | 5,400,000,000 |
| DW5000c | 37,5 | 60 | 2,250 | 150,000,000 | 9,000,000,000 |
| DW6000c | 45 | 60 | 2.700 | 180,000,000 | 10,800,000,000 |
| DW7500c | 56.25 | 60 | 3,375 | 225,000,000 | 13,500,000,000 |
| DW10000c | 75 | 60 | 4\.500 | 300,000,000 | 18,000,000,000 |
| DW15000c | 112.5 | 60 | 6,750 | 450,000,000 | 27,000,000,000 |
| DW30000c | 225 | 60 | 13,500 | 900,000,000 | 54,000,000,000 |
Generation 1
| DWU | Obergrenze pro Verteilung (GB) | Anzahl der Verteilungen | MAX Transaktionsgröße (GB) | # Zeilen pro Verteilung | Max. Zeilen pro Transaktion |
|---|---|---|---|---|---|
| DW100 | 1 | 60 | 60 | 4,000,000 | 240,000,000 |
| DW200 | 1.5 | 60 | 90 | 6,000,000 | 360.000.000 |
| DW300 | 2,25 | 60 | 135 | 9,000,000 | 540,000,000 |
| DW400 | 3 | 60 | 180 | 12,000,000 | 720,000,000 |
| DW500 | 3,75 | 60 | 225 | 15.000.000 | 900,000,000 |
| DW600 | 4.5 | 60 | 270 | 18.000.000 | 1,080,000,000 |
| DW1000 | 7,5 | 60 | 450 | 30,000,000 | 1,800,000,000 |
| DW1200 | 9 | 60 | 540 | 36.000.000 | 2,160,000,000 |
| DW1500 | 11.25 | 60 | 675 | 45,000,000 | 2,700,000,000 |
| DW2000 | 15 | 60 | 900 | 60.000.000 | 3,600,000,000 |
| DW3000 | 22,5 | 60 | 1,350 | 90.000.000 | 5,400,000,000 |
| DW6000 | 45 | 60 | 2.700 | 180,000,000 | 10,800,000,000 |
Die Transaktionsgrößenbeschränkung wird pro Transaktion oder Vorgang angewendet. Sie wird nicht für alle gleichzeitigen Transaktionen angewendet. Daher darf jede Transaktion diese Datenmenge in das Protokoll schreiben.
Informationen zum Optimieren und Minimieren der Datenmenge, die in das Protokoll geschrieben wurde, finden Sie im Artikel " Bewährte Methoden für Transaktionen ".
Warnung
Die maximale Transaktionsgröße kann nur für HASH- oder ROUND_ROBIN-verteilte Tabellen erreicht werden, wo die Verteilung der Daten gleichmäßig ist. Wenn die Transaktion Daten in schiefer Weise in die Verteilungen schreibt, wird die Grenze wahrscheinlich vor der maximalen Transaktionsgröße erreicht.
Transaktionsstatus
Der dedizierte SQL-Pool verwendet die funktion XACT_STATE() zum Melden einer fehlgeschlagenen Transaktion mit dem Wert -2. Dieser Wert bedeutet, dass die Transaktion fehlgeschlagen ist und nur für rollback markiert ist.
Hinweis
Die Verwendung von -2 durch die XACT_STATE-Funktion, um eine fehlgeschlagene Transaktion zu kennzeichnen, stellt ein anderes Verhalten für SQL Server dar. SQL Server verwendet den Wert -1, um eine nicht auskommentierbare Transaktion darzustellen. SQL Server kann einige Fehler innerhalb einer Transaktion tolerieren, ohne dass sie als nichtmittbar gekennzeichnet werden muss. Beispielsweise würde SELECT 1/0 einen Fehler verursachen, aber nicht eine Transaktion in einen nicht festschreibbaren Zustand versetzen. SQL Server erlaubt auch Lesevorgänge in einer nicht beständigen Transaktion. Der dedizierte SQL-Pool lässt dies jedoch nicht zu. Wenn innerhalb einer dedizierten SQL-Pooltransaktion ein Fehler auftritt, wird automatisch der -2 Zustand eingegeben, und Sie können keine weiteren Auswahlanweisungen vornehmen, bis die Anweisung zurückgesetzt wurde. Daher ist es wichtig zu überprüfen, ob Ihr Anwendungscode XACT_STATE() verwendet, da Sie möglicherweise Codeänderungen vornehmen müssen.
In SQL Server wird beispielsweise eine Transaktion angezeigt, die wie folgt aussieht:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
Der vorangehende Code gibt die folgende Fehlermeldung an:
Msg 111233, Ebene 16, Zustand 1, Zeile 1 111233; Die aktuelle Transaktion wurde abgebrochen, und alle ausstehenden Änderungen wurden zurückgesetzt. Ursache: Eine Transaktion in einem Rollback-Only-Zustand wurde vor einer DDL-, DML- oder SELECT-Anweisung nicht explizit zurückgerollt.
Sie erhalten die Ausgabe der ERROR_*-Funktionen nicht.
Im dedizierten SQL-Pool muss der Code leicht geändert werden:
SET NOCOUNT ON;
DECLARE @xact_state smallint = 0;
BEGIN TRAN
BEGIN TRY
DECLARE @i INT;
SET @i = CONVERT(INT,'ABC');
END TRY
BEGIN CATCH
SET @xact_state = XACT_STATE();
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
PRINT 'ROLLBACK';
END
SELECT ERROR_NUMBER() AS ErrNumber
, ERROR_SEVERITY() AS ErrSeverity
, ERROR_STATE() AS ErrState
, ERROR_PROCEDURE() AS ErrProcedure
, ERROR_MESSAGE() AS ErrMessage
;
END CATCH;
IF @@TRANCOUNT >0
BEGIN
PRINT 'COMMIT';
COMMIT TRAN;
END
SELECT @xact_state AS TransactionState;
Das erwartete Verhalten wird jetzt beobachtet. Der Fehler in der Transaktion wird verwaltet, und die funktionen ERROR_* stellen Werte wie erwartet bereit.
Alles, was sich geändert hat, ist, dass das ROLLBACK der Transaktion vor dem Auslesen der Fehlerinformationen im CATCH-Block erfolgen musste.
Error_Line()-Funktion
Beachten Sie auch, dass der dedizierte SQL-Pool die funktion ERROR_LINE() nicht implementiert oder unterstützt. Wenn Sie diese Funktion in Ihrem Code haben, müssen Sie sie entfernen, damit sie mit dediziertem SQL-Pool kompatibel ist. Verwenden Sie stattdessen Abfragebeschriftungen in Ihrem Code, um gleichwertige Funktionen zu implementieren. Weitere Informationen finden Sie im LABEL-Artikel .
Verwendung von THROW und RAISERROR
THROW ist die modernere Implementierung zum Auslösen von Ausnahmen im dedizierten SQL-Pool, aber RAISERROR wird ebenfalls unterstützt. Es gibt jedoch einige Unterschiede, die es wert sind, die Aufmerksamkeit zu schenken.
- Benutzerdefinierte Fehlermeldungen können sich nicht im Bereich von 100.000 - 150.000 für THROW befinden.
- RAISERROR-Fehlermeldungen sind auf 50.000 festgelegt.
- Die Verwendung von sys.messages wird nicht unterstützt.
Einschränkungen
Dedizierter SQL-Pool hat einige andere Einschränkungen, die sich auf Transaktionen beziehen. Sie sind wie folgt:
- Keine verteilten Transaktionen
- Keine geschachtelten Transaktionen zulässig
- Keine Speicherpunkte zulässig
- Keine benannten Transaktionen
- Keine markierten Transaktionen
- Keine Unterstützung für DDL wie CREATE TABLE in einer benutzerdefinierten Transaktion
Nächste Schritte
Weitere Informationen zum Optimieren von Transaktionen finden Sie unter "Bewährte Methoden für Transaktionen". Weitere Anleitungen zu bewährten Methoden werden auch für dedizierten SQL-Pool und serverlosen SQL-Pool bereitgestellt.