Cvičení – optimalizace výkonu aplikace

Dokončeno

V tomto cvičení se podíváte na nový scénář výkonu a vyřešíte ho optimalizací aplikace a dotazů.

Cvičení – optimalizace výkonu aplikace s Azure SQL

V některých případech může migrace stávající aplikace a úlohy dotazů SQL do Azure odhalit příležitosti pro optimalizaci a vyladění dotazů.

Kvůli podpoře nového rozšíření webu pro objednávky AdventureWorks, které má poskytnout systém hodnocení od zákazníků, potřebujete přidat novou tabulku pro masivní sadu souběžných aktivit typu INSERT. Otestovali jste úlohu dotazů SQL na vývojovém počítači s SQL Serverem 2022, který má místní jednotku SSD pro databázi a transakční protokol.

Když test přesunete do Azure SQL Database s použitím úrovně Pro obecné účely (8 virtuálních jader), je úloha INSERT pomalejší. Měli byste kvůli podpoře nové úlohy změnit cíl nebo úroveň služby nebo prověřit aplikaci?

Všechny skripty pro toto cvičení najdete ve složce 04-Performance\tuning_applications v úložišti GitHub, které jste naklonovali, nebo v souboru ZIP, který jste stáhli.

Vytvoření nové tabulky pro aplikaci

V Průzkumníku objektů vyberte databázi AdventureWorks. Pomocí souboru Otevřít>soubor otevřete skript order_rating_ddl.sql k vytvoření tabulky v AdventureWorks databázi.> V okně editoru dotazů by se měl zobrazit text podobný následujícímu:

DROP TABLE IF EXISTS SalesLT.OrderRating;
GO
CREATE TABLE SalesLT.OrderRating
(OrderRatingID int identity not null,
SalesOrderID int not null,
OrderRatingDT datetime not null,
OrderRating int not null,
OrderRatingComments char(500) not null);
GO

Vyberte Spustit a spusťte skript.

Načtení dotazů pro monitorování provádění dotazů

Teď pojďme načíst některé dotazy T-SQL pro zobrazení dynamické správy, které sledují výkon dotazů – aktivní dotazy, čekání a V/V. Všechny tyto dotazy načtěte v kontextu databáze AdventureWorks.

  1. V Průzkumníku objektů vyberte databázi AdventureWorks. Pomocí souboru Otevřít>soubor otevřete skript sqlrequests.sql a prohlédněte si aktivní dotazy SQL.> V okně editoru dotazů by se měl zobrazit text podobný následujícímu:

    SELECT er.session_id, er.status, er.command, er.wait_type, er.last_wait_type, er.wait_resource, er.wait_time
    FROM sys.dm_exec_requests er
    INNER JOIN sys.dm_exec_sessions es
    ON er.session_id = es.session_id
    AND es.is_user_process = 1;
    
  2. V Průzkumníku objektů vyberte databázi AdventureWorks. Pomocí souboru Otevřít>soubor otevřete skript top_waits.sql a prohlédněte si hlavní typy čekání podle počtu.> V okně editoru dotazů by se měl zobrazit text podobný následujícímu:

    SELECT * FROM sys.dm_os_wait_stats
    ORDER BY waiting_tasks_count DESC;
    
  3. V Průzkumníku objektů vyberte databázi AdventureWorks. Pomocí souboru Otevřít>soubor otevřete skript tlog_io.sql a sledujte latenci zápisů transakčního protokolu.> V okně editoru dotazů by se měl zobrazit text podobný následujícímu:

    SELECT io_stall_write_ms/num_of_writes as avg_tlog_io_write_ms, * 
    FROM sys.dm_io_virtual_file_stats
    (db_id('AdventureWorks'), 2);
    

Příprava skriptu úlohy ke spuštění

Otevřete a upravte skript úlohy order_rating_insert_single.cmd .

  • Nahraďte své unique_id jméno v prvním cvičení názvem serveru .-S parameter
  • Nahraďte heslo, které jste zadali v nasazení databáze z prvního cvičení .-P parameter
  • Uložte změny souboru.

Spuštění úlohy

  1. V příkazovém řádku PowerShellu přejděte do adresáře pro aktivity tohoto modulu:

    cd c:<base directory>\04-Performance\tuning_applications
    
  2. Ke spuštění úlohy použijte následující příkaz:

    .\order_rating_insert_single.cmd
    

    Tento skript používá program ostress.exe k souběžnému provádění následujícího příkazu jazyka T-SQL 25 uživateli (ve skriptu order_rating_insert_single.sql):

    DECLARE @x int;
    SET @x = 0;
    WHILE (@x < 500)
    BEGIN
    SET @x = @x + 1;
    INSERT INTO SalesLT.OrderRating
    (SalesOrderID, OrderRatingDT, OrderRating, OrderRatingComments)
    VALUES (@x, getdate(), 5, 'This was a great order');
    END
    

    Z tohoto skriptu můžete vidět, že se nejedná zrovna o skutečné znázornění data pocházejících z webu. Simuluje ale řadu hodnocení objednávek ingestovaných do databáze.

Sledování zobrazení dynamické správy a výkonu úlohy

Pro sledování výkonu teď v nástroji SQL Server Management Studio (SSMS) spustíte dotazy, které jste dříve načetli. Spusťte dotazy sqlrequests.sql, top_waits.sql a tlog_io.sql.

Pomocí těchto dotazů zjistíte následující fakta:

  • Mnoho požadavků má neustále wait_type hodnotu WRITELOG s hodnotou > 0.
  • Typ WRITELOG čekání je jedním z nejvyšších počtů pro typy čekání.
  • Průměrná doba zápisu do transakčního protokolu ( avg_tlog_io_write_ms sloupec v sadě výsledků tlog_io.sql ) je někde kolem 2 ms.

Doba trvání této úlohy v instanci SQL Serveru 2022 s jednotkou SSD je přibližně 10 až 12 sekund. Celková doba trvání u Azure SQL Database používající Gen5 V8 Core je přibližně 25 sekund.

WRITELOG Typy čekání s vyšší dobou čekání značí vyprázdnění latence do transakčního protokolu. Doba čekání 2 ms na zápis nevypadá jako dlouhá, ale u místní jednotky SSD můžou být tato čekání menší než 1 ms.

Rozhodnutí o řešení

Problémem není vysoké procento aktivity zápisů do protokolu. Na webu Azure Portal se sys.dm_db_resource_stats nezobrazují žádná čísla vyšší než 20–25 procent (nemusíte je dotazovat). Problémem není ani omezení IOPS. Problémem je to, že tato úloha aplikace je citlivá na nízkou latenci zápisů do transakčního protokolu a úroveň Pro obecné účely není určená pro tento typ požadavků na latenci. Očekávaná latence vstupně-výstupních operací pro Azure SQL Database je 5 až 7 ms.

Poznámka:

V dokumentaci Azure SQL Database s úrovní Pro obecné účely se průměrná latence V/V uvádí přibližně 5–7 ms (pro zápisy) a 5–10 ms (pro čtení). Můžete setkat s latencemi podobnými těmto hodnotám. Latence pro spravovanou instanci Azure SQL pro obecné účely jsou podobné. Pokud je vaše aplikace na latence V/V velmi citlivá, zvažte úrovně Pro důležité obchodní informace.

Prozkoumejte skript T-SQL úlohy order_rating_insert_single.sql. Každý z nich INSERT je jedno potvrzení transakce, které vyžaduje vyprázdnění transakčního protokolu.

Jedno potvrzení pro každé vložení není efektivní, ale na aplikaci to nemělo na místní jednotce SSD vliv, protože každé potvrzení bylo velmi rychlé. Cenová úroveň Pro důležité obchodní informace (cíl služby nebo SKU) poskytuje místní jednotky SSD s nižší latencí. Je možné, že existuje optimalizace aplikace, takže úloha není tak citlivá na latenci vstupně-výstupních operací transakčního protokolu.

Dávku T-SQL pro úlohu můžete změnit tak, aby obtékání BEGIN TRAN/COMMIT TRAN INSERT iterací.

Spuštění upravené efektivnější úlohy

Proveďte úpravy skriptů a spusťte je, abyste viděli efektivnější výkon V/V. Upravenou úlohu najdete ve skriptu order_rating_insert.sql .

  1. Připravte skript úlohy úpravou order_rating_insert.cmd tak, aby používal správný název serveru a heslo.

  2. Upravené úlohy spusťte pomocí skriptu order_rating_insert.cmd , podobně jako jste spustili předchozí skript úlohy.

Sledování nových výsledků

  1. V SSMS se podívejte na výsledky skriptu T-SQL sqlrequests.sql. Všimněte si mnohem menšího počtu čekání WRITELOG a celkově mešní doby čekání.

    Úloha teď běží v porovnání s předchozím spuštěním mnohem rychleji. Toto je příklad optimalizace aplikace pro dotazy SQL, které poběží uvnitř nebo mimo Azure.

    Poznámka:

    Tato úloha může běžet ještě rychleji u instance služby Azure SQL Database s typem připojení Přesměrovat . Nasazení, které jste v tomto cvičení provedli, používá výchozí typ připojení, což je typ proxy serveru, protože jste připojení mimo Azure. Připojení typu Přesměrovat může takovouto úlohu významně zrychlit vzhledem k menšímu počtu nutných cest z klienta na server a zpět.

  2. Sledujte dobu trvání úlohy. Úloha poběží tak rychle, že může být obtížné sledovat diagnostická data z dotazů použitých dříve v této aktivitě.

    Koncept „dávkování“ může pomáhat většině aplikací, včetně těch, které jsou připojené k Azure SQL.

Tip

Zásady správného řízení prostředků v Azure můžou ovlivnit velmi velké transakce a příznaky budou LOG_RATE_GOVERNOR. V tomto příkladu je sloupec typu char(500) Not Null doplněný mezerami a způsobuje velké záznamy transakčního protokolu. Výkon můžete dále optimalizovat tím, že tento sloupec změníte na sloupec s proměnnou délkou.

V další lekci se dozvíte o inteligentním výkonu v Azure SQL.