Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tipy pro implementaci transakcí s vyhrazeným fondem SQL ve službě Azure Synapse Analytics pro vývoj řešení
Co očekávat
Jak byste očekávali, vyhrazený fond SQL podporuje transakce jako součást úlohy datového skladu. Pokud ale chcete zajistit, aby byl výkon vyhrazeného fondu SQL udržován ve velkém měřítku, některé funkce jsou ve srovnání s SQL Serverem omezené. Tento článek popisuje rozdíly a uvádí ostatní.
Úrovně izolace transakcí
Vyhrazená skupina SQL implementuje transakce ACID. Úroveň izolace transakční podpory je výchozí hodnota READ UNCOMMITTED. Můžete ho změnit na READ COMMITTED SNAPSHOT ISOLATION zapnutím možnosti READ_COMMITTED_SNAPSHOT pro uživatelskou databázi při připojení k hlavní databázi (master database).
Po povolení se všechny transakce v této databázi provedou v režimu READ COMMITTED SNAPSHOT ISOLATION a nastavení READ UNCOMMITTED na úrovni relace nebude bráno v úvahu. Podrobnosti najdete v možnostech ALTER DATABASE SET (Transact-SQL).
Velikost transakce
Jedna transakce úpravy dat je omezená velikostí. Omezení se použije pro každé rozdělení. Celkové přidělení se proto dá vypočítat vynásobením limitu počtem rozdělení.
Pokud chcete odhadnout maximální počet řádků v transakci, udělejte to tak, že horní limit dělíte celkovou velikostí každého řádku. U sloupců s proměnlivou délkou zvažte místo použití maximální velikosti průměrnou délku sloupce.
V tabulce níže jsou provedeny následující předpoklady:
- Došlo k rovnoměrné distribuci dat.
- Průměrná délka řádku je 250 bajtů.
Gen2
| DWU | Limit na distribuci (GB) | Počet rozdělení | MAXIMÁLNÍ velikost transakce (GB) | # Řádky na distribuci | Maximální počet řádků na transakci |
|---|---|---|---|---|---|
| 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 |
Gen1
| DWU | Limit na distribuci (GB) | Počet rozdělení | MAXIMÁLNÍ velikost transakce (GB) | # Řádky na jednu distribuci | Maximální počet řádků na transakci |
|---|---|---|---|---|---|
| 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 |
Limit velikosti transakce se použije na transakci nebo operaci. Nevztahuje se na všechny souběžné transakce. Každá transakce je proto povolena k zápisu tohoto množství dat do protokolu.
Pokud chcete optimalizovat a minimalizovat množství dat zapsaných do protokolu, přečtěte si článek o osvědčených postupech transakcí .
Výstraha
Maximální velikosti transakce lze dosáhnout pouze u tabulek distribuovaných pomocí HASH nebo ROUND_ROBIN, kde je rozložení dat rovnoměrné. Pokud transakce zapisuje data nerovnoměrně do distribucí, je pravděpodobné, že se dosáhne limitu před maximální velikostí transakce.
Stav transakce
Vyhrazený fond SQL používá funkci XACT_STATE() k hlášení neúspěšné transakce pomocí hodnoty -2. Tato hodnota znamená, že transakce selhala a je označena pouze pro vrácení zpět.
Poznámka:
Použití -2 funkcí XACT_STATE k označení neúspěšné transakce představuje odlišné chování SQL Serveru. SQL Server používá hodnotu -1 k reprezentaci nekommitovatelné transakce. SQL Server může tolerovat některé chyby uvnitř transakce, aniž by musel být označen jako nekommitovatelný. Například SELECT 1/0 by způsobilo chybu, ale nezpůsobuje transakci nepotvrditelný stav. SQL Server také umožňuje čtení v nekommitovatelné transakci. Vyhrazený SQL pool to ale neumožňuje. Pokud dojde k chybě uvnitř vyhrazené transakce fondu SQL, automaticky přejde do stavu -2 a nebudete moci provádět žádné další SELECT dotazy, dokud nevrátíte příkaz zpět. Proto je důležité zkontrolovat, jestli kód aplikace používá XACT_STATE(), protože možná budete muset provést úpravy kódu.
Například na SQL Serveru se může zobrazit transakce, která vypadá takto:
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;
Předchozí kód zobrazí následující chybovou zprávu:
msg 111233, úroveň 16, stav 1, řádek 1 111233; Aktuální transakce byla přerušena a všechny čekající změny byly vráceny zpět. Příčina: Transakce v nevratném stavu nebyla explicitně vrácena zpět před příkazem DDL, DML nebo SELECT.
Nebudete dostávat výstup funkcí ERROR_*.
Ve vyhrazeném fondu SQL je potřeba kód mírně změnit:
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;
Očekávané chování je nyní pozorováno. Chyba v transakci je spravována a funkce ERROR_* poskytují hodnoty podle očekávání.
Vše, co se změnilo, je, že vrácení zpět transakce muselo proběhnout před čtením informací o chybě v bloku CATCH.
Error_Line()
Je také třeba poznamenat, že dedikovaný SQL fond neimplementuje ani nepodporuje funkci ERROR_LINE(). Pokud tuto funkci máte ve svém kódu, musíte ji odebrat, aby vyhovovala vyhrazenému fondu SQL. Místo toho použijte popisky dotazů v kódu k implementaci ekvivalentních funkcí. Další informace najdete v článku LABEL .
Použití příkazů THROW a RAISERROR
THROW je modernější implementace pro vyvolání výjimek ve vyhrazeném fondu SQL, ale RAISERROR je také podporována. Existuje několik rozdílů, které stojí za to věnovat pozornost však.
- Uživatelsky definované chybové zprávy nemůžou být v rozsahu 100 000 – 150 000 pro throw
- Chybové zprávy RAISERROR jsou nastaveny na 50 000.
- Použití sys.messages není podporováno.
Omezení
Vyhrazený fond SQL má několik dalších omezení, která se vztahují k transakcím. Jsou to následující:
- Žádné distribuované transakce
- Nejsou povoleny žádné vnořené transakce.
- Nejsou povoleny žádné body uložení.
- Žádné pojmenované transakce
- Žádné označené transakce
- Nepodporuje se DDL, jako je CREATE TABLE uvnitř uživatelem definované transakce
Další kroky
Další informace o optimalizaci transakcí najdete v osvědčených postupech pro transakce. Další průvodci osvědčenými postupy jsou k dispozici také pro vyhrazený fond SQL a bezserverový fond SQL.