Dostrajanie aplikacji i baz danych pod kątem wydajności w Azure SQL Database i wystąpieniu zarządzanym usługi Azure SQLTune applications and databases for performance in Azure SQL Database and Azure SQL Managed Instance

APPLIES TO: yesAzure SQL Database yesAzure SQL Managed Instance

Po zidentyfikowaniu problemu z wydajnością, który jest dostępny dla Azure SQL Database i wystąpienia zarządzanego usługi Azure SQL, ten artykuł ma na celu ułatwienie:Once you have identified a performance issue that you are facing with Azure SQL Database and Azure SQL Managed Instance, this article is designed to help you:

  • Dostosuj aplikację i Zastosuj niektóre najlepsze rozwiązania, które mogą zwiększyć wydajność.Tune your application and apply some best practices that can improve performance.
  • Dostrajaj bazę danych, zmieniając indeksy i zapytania, aby skuteczniej pracować z danymi.Tune the database by changing indexes and queries to more efficiently work with data.

W tym artykule przyjęto założenie, że już pracujesz z zaleceniami usługi Azure SQL Database Database i Azure SQL Database zalecenia autodostrajania, jeśli ma to zastosowanie.This article assumes that you have already worked through the Azure SQL Database database advisor recommendations and the Azure SQL Database auto-tuning recommendations, if applicable. Przyjęto również założenie, że przegląd dotyczący monitorowania i dostrajania oraz powiązanych artykułów związanych z rozwiązywaniem problemów z wydajnością.It also assumes that you have reviewed An overview of monitoring and tuning and its related articles related to troubleshooting performance issues. Ponadto w tym artykule założono, że nie masz zasobów procesora, problem z wydajnością związany z działaniem, który można rozwiązać przez zwiększenie rozmiaru lub warstwy usług w celu zapewnienia większej ilości zasobów dla bazy danych.Additionally, this article assumes that you do not have a CPU resources, running-related performance issue that can be resolved by increasing the compute size or service tier to provide more resources to your database.

Dostrajanie aplikacjiTune your application

W tradycyjnych SQL Server lokalnych, proces wstępnego planowania pojemności jest często oddzielony od procesu uruchamiania aplikacji w środowisku produkcyjnym.In traditional on-premises SQL Server, the process of initial capacity planning often is separated from the process of running an application in production. Najpierw zakupione są licencje sprzętowe i produktowe, a następnie dostrojenie wydajności odbywa się później.Hardware and product licenses are purchased first, and performance tuning is done afterward. W przypadku korzystania z Azure SQL Database lub wystąpienia zarządzanego usługi Azure SQL jest dobrym pomysłem, aby przetwarzać proces uruchamiania aplikacji i dostrajania go.When you use Azure SQL Database or Azure SQL Managed Instance, it's a good idea to interweave the process of running an application and tuning it. Dzięki modelowi płacenia za pojemność na żądanie możesz dostosować swoją aplikację do korzystania z minimalnych zasobów wymaganych teraz, zamiast nadmiernej aprowizacji sprzętu na podstawie odgadnięcia przyszłych planów wzrostu dla aplikacji, które często są nieprawidłowe.With the model of paying for capacity on demand, you can tune your application to use the minimum resources needed now, instead of over-provisioning on hardware based on guesses of future growth plans for an application, which often are incorrect. Niektórzy klienci mogą zrezygnować z dostrajania aplikacji, a zamiast tego wybrać opcję nadmierne udostępnianie zasobów sprzętowych.Some customers might choose not to tune an application, and instead choose to over-provision hardware resources. Takie podejście może być dobrym pomysłem, jeśli nie chcesz zmieniać kluczowych aplikacji w okresie zajętości.This approach might be a good idea if you don't want to change a key application during a busy period. Jednak dostrajanie aplikacji może zminimalizować wymagania dotyczące zasobów i obniżyć miesięczne rachunki w przypadku używania warstw usług w Azure SQL Database i wystąpieniu zarządzanym usługi Azure SQL.But, tuning an application can minimize resource requirements and lower monthly bills when you use the service tiers in Azure SQL Database and Azure SQL Managed Instance.

Charakterystyka aplikacjiApplication characteristics

Chociaż Azure SQL Database i warstwy usługi wystąpienia zarządzanego Azure SQL zostały zaprojektowane w celu poprawy stabilności wydajności i przewidywalności aplikacji, niektóre najlepsze rozwiązania mogą pomóc w dostosowaniu aplikacji w celu lepszego wykorzystania zasobów w rozmiarze obliczeniowym.Although Azure SQL Database and Azure SQL Managed Instance service tiers are designed to improve performance stability and predictability for an application, some best practices can help you tune your application to better take advantage of the resources at a compute size. Mimo że wiele aplikacji ma znaczący wpływ na wydajność, wystarczy przełączać się do wyższego rozmiaru lub warstwy usług, a niektóre aplikacje wymagają dodatkowego dostrajania do skorzystania z wyższego poziomu usługi.Although many applications have significant performance gains simply by switching to a higher compute size or service tier, some applications need additional tuning to benefit from a higher level of service. Aby zwiększyć wydajność, należy rozważyć dodatkowe dostrajanie aplikacji dla aplikacji o następujących cechach:For increased performance, consider additional application tuning for applications that have these characteristics:

  • Aplikacje z niską wydajnością z powodu zachowania "rozmawiania"Applications that have slow performance because of "chatty" behavior

    Aplikacje rozmawiające umożliwiają nadmierne wykonywanie operacji dostępu do danych, które są wrażliwe na opóźnienia sieci.Chatty applications make excessive data access operations that are sensitive to network latency. Może być konieczne zmodyfikowanie tych rodzajów aplikacji w celu zmniejszenia liczby operacji dostępu do danych w bazie danych.You might need to modify these kinds of applications to reduce the number of data access operations to the database. Na przykład można poprawić wydajność aplikacji przy użyciu technik takich jak przetwarzanie wsadowe zapytań ad hoc lub przechodzenie zapytań do procedur składowanych.For example, you might improve application performance by using techniques like batching ad hoc queries or moving the queries to stored procedures. Aby uzyskać więcej informacji, zobacz zapytania wsadowe.For more information, see Batch queries.

  • Bazy danych z intensywnym obciążeniem, które nie mogą być obsługiwane przez całą pojedynczą maszynęDatabases with an intensive workload that can't be supported by an entire single machine

    Bazy danych, które przekraczają zasoby o najwyższej wielkości obliczeń w warstwie Premium, mogą przynieść skalowanie obciążenia.Databases that exceed the resources of the highest Premium compute size might benefit from scaling out the workload. Aby uzyskać więcej informacji, zobacz fragmentowania między bazami danych i partycjonowanie funkcjonalne.For more information, see Cross-database sharding and Functional partitioning.

  • Aplikacje z nieoptymalnymi zapytaniamiApplications that have sub-optimal queries

    Aplikacje, szczególnie te w warstwie dostępu do danych, które mają źle dopasowane zapytania, mogą nie być korzystne z większym rozmiarem obliczeniowym.Applications, especially those in the data access layer, that have poorly tuned queries might not benefit from a higher compute size. Obejmuje to zapytania, które nie mają klauzuli WHERE, mają brakujące indeksy lub mają nieaktualne dane statystyczne.This includes queries that lack a WHERE clause, have missing indexes, or have outdated statistics. Te aplikacje korzystają z standardowych technik dostrajania wydajności zapytań.These applications benefit from standard query performance-tuning techniques. Aby uzyskać więcej informacji, zobacz brakujące indeksy i dostrajanie zapytań oraz podpowiedzi.For more information, see Missing indexes and Query tuning and hinting.

  • Aplikacje mające optymalny projekt dostępu do danychApplications that have sub-optimal data access design

    Aplikacje, które mają nieodłączne problemy z współbieżnością dostępu do danych, na przykład zakleszczenie mogą nie korzystać z większego rozmiaru obliczeniowego.Applications that have inherent data access concurrency issues, for example deadlocking, might not benefit from a higher compute size. Należy rozważyć zmniejszenie liczby rund do bazy danych przez buforowanie danych po stronie klienta za pomocą usługi Azure buforowania lub innej technologii buforowania.Consider reducing round trips against the database by caching data on the client side with the Azure Caching service or another caching technology. Zobacz buforowanie warstwy aplikacji.See Application tier caching.

Dostrajanie bazy danychTune your database

W tej sekcji Przyjrzyjmy się pewnym technikom, które służą do dostrajania bazy danych w celu uzyskania najlepszej wydajności aplikacji i uruchamiania jej przy najniższym możliwym rozmiarze.In this section, we look at some techniques that you can use to tune database to gain the best performance for your application and run it at the lowest possible compute size. Niektóre z tych technik są zgodne z tradycyjnymi rozwiązaniami SQL Server dostrajania, ale inne są specyficzne dla Azure SQL Database i wystąpienia zarządzanego usługi Azure SQL.Some of these techniques match traditional SQL Server tuning best practices, but others are specific to Azure SQL Database and Azure SQL Managed Instance. W niektórych przypadkach można sprawdzić zużyte zasoby dla bazy danych, aby znaleźć obszary umożliwiające dalsze dostosowywanie i rozszerzanie tradycyjnych technik SQL Server do pracy w Azure SQL Database i wystąpieniu zarządzanym usługi Azure SQL.In some cases, you can examine the consumed resources for a database to find areas to further tune and extend traditional SQL Server techniques to work in Azure SQL Database and Azure SQL Managed Instance.

Identyfikowanie i Dodawanie brakujących indeksówIdentifying and adding missing indexes

Typowy problem związany z wydajnością bazy danych OLTP odnosi się do fizycznego projektu bazy danych.A common problem in OLTP database performance relates to the physical database design. Często schematy bazy danych są zaprojektowane i dostarczane bez testów w dużej skali (w przypadku ładowania lub w woluminie danych).Often, database schemas are designed and shipped without testing at scale (either in load or in data volume). Niestety, wydajność planu zapytania może być akceptowalna na małą skalę, ale istotnie zmniejsza się w zależności od ilości danych na poziomie produkcyjnym.Unfortunately, the performance of a query plan might be acceptable on a small scale but degrade substantially under production-level data volumes. Najbardziej typowym źródłem tego problemu jest brak odpowiednich indeksów w celu spełnienia filtrów lub innych ograniczeń w zapytaniu.The most common source of this issue is the lack of appropriate indexes to satisfy filters or other restrictions in a query. Często brakujące indeksy manifestuje się jako skanowanie tabeli, gdy wyszukiwanie może być wystarczające.Often, missing indexes manifests as a table scan when an index seek could suffice.

W tym przykładzie wybrany plan zapytania używa skanowania, gdy wystarczająca jest wartość wyszukiwania:In this example, the selected query plan uses a scan when a seek would suffice:

DROP TABLE dbo.missingindex;
CREATE TABLE dbo.missingindex (col1 INT IDENTITY PRIMARY KEY, col2 INT);
DECLARE @a int = 0;
SET NOCOUNT ON;
BEGIN TRANSACTION
    WHILE @a < 20000
    BEGIN
        INSERT INTO dbo.missingindex(col2) VALUES (@a);
        SET @a += 1;
    END
    COMMIT TRANSACTION;
    GO
SELECT m1.col1
    FROM dbo.missingindex m1 INNER JOIN dbo.missingindex m2 ON(m1.col1=m2.col1)
    WHERE m1.col2 = 4;

Plan zapytania z brakującymi indeksami

Azure SQL Database i wystąpienie zarządzane usługi Azure SQL mogą pomóc w znalezieniu i naprawieniu typowych warunków brakujących indeksów.Azure SQL Database and Azure SQL Managed Instance can help you find and fix common missing index conditions. Widoków DMV, które są wbudowane w Azure SQL Database i wystąpienie zarządzane usługi Azure SQL, przyjrzyj się kompilacjom zapytania, w którym indeks znacznie zmniejsza szacowany koszt do uruchomienia zapytania.DMVs that are built into Azure SQL Database and Azure SQL Managed Instance look at query compilations in which an index would significantly reduce the estimated cost to run a query. Podczas wykonywania zapytania aparat bazy danych śledzi, jak często jest wykonywany każdy plan zapytania, i śledzi szacowaną lukę między wykonywanym planem zapytania a zawyobraź sobie, gdzie istniał ten indeks.During query execution, the database engine tracks how often each query plan is executed, and tracks the estimated gap between the executing query plan and the imagined one where that index existed. Za pomocą tych widoków DMV można szybko odgadnąć, które zmiany w projekcie fizycznej bazy danych mogą poprawić ogólny koszt obciążeń dla bazy danych i jej rzeczywistego obciążenia.You can use these DMVs to quickly guess which changes to your physical database design might improve overall workload cost for a database and its real workload.

Za pomocą tego zapytania można oszacować potencjalne brakujące indeksy:You can use this query to evaluate potential missing indexes:

SELECT
   CONVERT (varchar, getdate(), 126) AS runtime
   , mig.index_group_handle
   , mid.index_handle
   , CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact *
        (migs.user_seeks + migs.user_scans)) AS improvement_measure
   , 'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' +
        CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + '
        (' + ISNULL (mid.equality_columns,'')
        + CASE WHEN mid.equality_columns IS NOT NULL
        AND mid.inequality_columns IS NOT NULL
        THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') + ')'
        + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement
   , migs.*
   , mid.database_id
   , mid.[object_id]
FROM sys.dm_db_missing_index_groups AS mig
   INNER JOIN sys.dm_db_missing_index_group_stats AS migs
      ON migs.group_handle = mig.index_group_handle
   INNER JOIN sys.dm_db_missing_index_details AS mid
      ON mig.index_handle = mid.index_handle
 ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

W tym przykładzie zapytanie spowodowało następującą sugestię:In this example, the query resulted in this suggestion:

CREATE INDEX missing_index_5006_5005 ON [dbo].[missingindex] ([col2])  

Po jego utworzeniu ta sama instrukcja SELECT wybiera inny plan, który używa wyszukiwania zamiast skanowania, a następnie wykonuje plan wydajniejszie:After it's created, that same SELECT statement picks a different plan, which uses a seek instead of a scan, and then executes the plan more efficiently:

Plan zapytania ze poprawionymi indeksami

Kluczowym wglądem jest to, że pojemność we/wy udostępnionego systemu asortymentu jest bardziej ograniczona niż w przypadku dedykowanego komputera serwera.The key insight is that the IO capacity of a shared, commodity system is more limited than that of a dedicated server machine. Istnieje możliwość zminimalizowania niepotrzebnych operacji we/wy na wyższy poziom, co umożliwia maksymalne wykorzystanie systemu w zasobach każdego rozmiaru obliczeniowego warstw usług.There's a premium on minimizing unnecessary IO to take maximum advantage of the system in the resources of each compute size of the service tiers. Opcje projektowania odpowiednich fizycznych baz danych mogą znacząco poprawić opóźnienia poszczególnych zapytań, zwiększyć przepływność współbieżnych żądań obsłużonych na jednostkę skalowania i zminimalizować koszty wymagane do zaspokojenia zapytania.Appropriate physical database design choices can significantly improve the latency for individual queries, improve the throughput of concurrent requests handled per scale unit, and minimize the costs required to satisfy the query. Aby uzyskać więcej informacji na temat brakującego indeksu widoków DMV, zobacz sys. dm_db_missing_index_details.For more information about the missing index DMVs, see sys.dm_db_missing_index_details.

Dostrajanie zapytania i podpowiedziQuery tuning and hinting

Optymalizator zapytań w Azure SQL Database i wystąpienie zarządzane Azure SQL jest podobny do tradycyjnego optymalizatora zapytań SQL Server.The query optimizer in Azure SQL Database and Azure SQL Managed Instance is similar to the traditional SQL Server query optimizer. Większość najlepszych rozwiązań dotyczących dostrajania zapytań i zrozumienie ograniczeń modelu przyczyny dla optymalizatora zapytań ma zastosowanie również do Azure SQL Database i wystąpienia zarządzanego Azure SQL.Most of the best practices for tuning queries and understanding the reasoning model limitations for the query optimizer also apply to Azure SQL Database and Azure SQL Managed Instance. Jeśli dostrojsz zapytania w Azure SQL Database i wystąpieniu zarządzanym Azure SQL, możesz skorzystać z dodatkowej korzyści wynikającej z obniżenia zagregowanych wymagań dotyczących zasobów.If you tune queries in Azure SQL Database and Azure SQL Managed Instance, you might get the additional benefit of reducing aggregate resource demands. Aplikacja może być uruchomiona z niższym kosztem niż niedostrojony odpowiednik, ponieważ może działać z mniejszym rozmiarem obliczeniowym.Your application might be able to run at a lower cost than an un-tuned equivalent because it can run at a lower compute size.

Przykład, który jest typowy w SQL Server i który ma zastosowanie również do Azure SQL Database i wystąpienia zarządzanego usługi Azure SQL, to sposób, w jaki są parametry "wykrywanie" optymalizatora zapytań.An example that is common in SQL Server and which also applies to Azure SQL Database and Azure SQL Managed Instance is how the query optimizer "sniffs" parameters. Podczas kompilacji optymalizator zapytań szacuje bieżącą wartość parametru, aby określić, czy może generować bardziej optymalny plan zapytania.During compilation, the query optimizer evaluates the current value of a parameter to determine whether it can generate a more optimal query plan. Chociaż taka strategia często może prowadzić do planu zapytania, który jest znacznie szybszy od planu skompilowanego bez znanych wartości parametrów, obecnie działa w sposób nieidealny zarówno w SQL Server, w Azure SQL Database, jak i w wystąpieniu zarządzanym usługi Azure SQL.Although this strategy often can lead to a query plan that is significantly faster than a plan compiled without known parameter values, currently it works imperfectly both in SQL Server, in Azure SQL Database, and Azure SQL Managed Instance. Czasami parametr nie jest wygenerowany i czasami jest wykrywanie parametru, ale wygenerowany plan jest optymalny dla pełnego zestawu wartości parametrów w obciążeniu.Sometimes the parameter is not sniffed, and sometimes the parameter is sniffed but the generated plan is sub-optimal for the full set of parameter values in a workload. Firma Microsoft zawiera wskazówki zapytania (dyrektywy), dzięki czemu można bardziej umyślnie określić cel i zastąpić domyślne zachowanie funkcji wykrywania parametrów.Microsoft includes query hints (directives) so that you can specify intent more deliberately and override the default behavior of parameter sniffing. Często, jeśli używasz wskazówek, możesz naprawić przypadki, w których domyślne zachowanie wystąpienia zarządzanego SQL Server, Azure SQL Database i Azure SQL jest nieidealne dla określonego obciążenia klienta.Often, if you use hints, you can fix cases in which the default SQL Server, Azure SQL Database, and Azure SQL Managed Instance behavior is imperfect for a specific customer workload.

W następnym przykładzie pokazano, jak procesor zapytań może wygenerować plan, który jest optymalny zarówno w przypadku wymagań dotyczących wydajności, jak i zasobów.The next example demonstrates how the query processor can generate a plan that is sub-optimal both for performance and resource requirements. Ten przykład pokazuje również, że jeśli używasz wskazówki zapytania, możesz zmniejszyć czas wykonywania zapytania i wymagania dotyczące zasobów dla bazy danych:This example also shows that if you use a query hint, you can reduce query run time and resource requirements for your database:

DROP TABLE psptest1;
CREATE TABLE psptest1(col1 int primary key identity, col2 int, col3 binary(200));
DECLARE @a int = 0;
SET NOCOUNT ON;
BEGIN TRANSACTION
   WHILE @a < 20000
   BEGIN
     INSERT INTO psptest1(col2) values (1);
     INSERT INTO psptest1(col2) values (@a);
     SET @a += 1;
   END
   COMMIT TRANSACTION
   CREATE INDEX i1 on psptest1(col2);
GO

CREATE PROCEDURE psp1 (@param1 int)
   AS
   BEGIN
      INSERT INTO t1 SELECT * FROM psptest1
      WHERE col2 = @param1
      ORDER BY col2;
    END
    GO

CREATE PROCEDURE psp2 (@param2 int)
   AS
   BEGIN
      INSERT INTO t1 SELECT * FROM psptest1 WHERE col2 = @param2
      ORDER BY col2
      OPTION (OPTIMIZE FOR (@param2 UNKNOWN))
   END
   GO

CREATE TABLE t1 (col1 int primary key, col2 int, col3 binary(200));
GO

Kod instalacji tworzy tabelę, która ma skośną dystrybucję danych.The setup code creates a table that has skewed data distribution. Optymalny plan zapytania różni się w zależności od tego, który parametr został wybrany.The optimal query plan differs based on which parameter is selected. Niestety zachowanie pamięci podręcznej planu nie zawsze powoduje ponowne skompilowanie zapytania na podstawie najbardziej typowej wartości parametru.Unfortunately, the plan caching behavior doesn't always recompile the query based on the most common parameter value. W związku z tym, istnieje możliwość, że plan podrzędny jest buforowany i używany dla wielu wartości, nawet jeśli inny plan może być lepszym wyborem planu.So, it's possible for a sub-optimal plan to be cached and used for many values, even when a different plan might be a better plan choice on average. Następnie plan zapytania tworzy dwie procedury składowane, które są identyczne, z tą różnicą, że jeden ma specjalną wskazówkę zapytania.Then the query plan creates two stored procedures that are identical, except that one has a special query hint.

-- Prime Procedure Cache with scan plan
EXEC psp1 @param1=1;
TRUNCATE TABLE t1;

-- Iterate multiple times to show the performance difference
DECLARE @i int = 0;
WHILE @i < 1000
   BEGIN
      EXEC psp1 @param1=2;
      TRUNCATE TABLE t1;
      SET @i += 1;
    END

Zalecamy odczekanie co najmniej 10 minut przed rozpoczęciem części 2 tego przykładu, aby wyniki były odrębne w wynikowych danych telemetrycznych.We recommend that you wait at least 10 minutes before you begin part 2 of the example, so that the results are distinct in the resulting telemetry data.

EXEC psp2 @param2=1;
TRUNCATE TABLE t1;

DECLARE @i int = 0;
    WHILE @i < 1000
    BEGIN
        EXEC psp2 @param2=2;
        TRUNCATE TABLE t1;
        SET @i += 1;
    END

Każda część tego przykładu podejmuje próbę uruchomienia sparametryzowanej instrukcji INSERT 1 000 razy (w celu wygenerowania wystarczającego obciążenia do użycia jako zestawu danych testowych).Each part of this example attempts to run a parameterized insert statement 1,000 times (to generate a sufficient load to use as a test data set). Gdy wykonuje procedury składowane, procesor zapytań analizuje wartość parametru, która jest przenoszona do procedury podczas pierwszej kompilacji (parametru "wykrywanie").When it executes stored procedures, the query processor examines the parameter value that is passed to the procedure during its first compilation (parameter "sniffing"). Procesor buforuje plan i używa go do późniejszego wywołania, nawet jeśli wartość parametru jest różna.The processor caches the resulting plan and uses it for later invocations, even if the parameter value is different. Optymalny plan nie może być używany we wszystkich przypadkach.The optimal plan might not be used in all cases. Czasami musisz poprowadzić Optymalizator w celu wybrania planu, który jest lepszy dla średniej wielkości liter zamiast określonego przypadku, od momentu pierwszego skompilowania zapytania.Sometimes you need to guide the optimizer to pick a plan that is better for the average case rather than the specific case from when the query was first compiled. W tym przykładzie początkowy plan generuje plan "Scan", który odczytuje wszystkie wiersze, aby znaleźć każdą wartość zgodną z parametrem:In this example, the initial plan generates a "scan" plan that reads all rows to find each value that matches the parameter:

Dostrajanie zapytania przy użyciu planu skanowania

Ponieważ procedura została wykonana przy użyciu wartości 1, otrzymany plan był optymalny dla wartości 1, ale był optymalny dla wszystkich innych wartości w tabeli.Because we executed the procedure by using the value 1, the resulting plan was optimal for the value 1 but was sub-optimal for all other values in the table. Wynik prawdopodobnie nie jest tym, co należy zrobić, jeśli chcesz losowo wybrać każdy plan, ponieważ plan działa wolniej i zużywa więcej zasobów.The result likely isn't what you would want if you were to pick each plan randomly, because the plan performs more slowly and uses more resources.

W przypadku uruchomienia testu z SET STATISTICS IO ustawioną na wartość w ON tym przykładzie działanie skanowania logicznego jest wykonywane w tle.If you run the test with SET STATISTICS IO set to ON, the logical scan work in this example is done behind the scenes. Zobaczysz, że istnieją 1 148 odczyty wykonywane przez plan (co jest niewydajne, jeśli średni przypadek ma zwrócić tylko jeden wiersz):You can see that there are 1,148 reads done by the plan (which is inefficient, if the average case is to return just one row):

Dostrajanie zapytania przy użyciu skanowania logicznego

W drugiej części przykładu użyto wskazówki zapytania, aby nakazać Optymalizatorowi użycie określonej wartości podczas procesu kompilacji.The second part of the example uses a query hint to tell the optimizer to use a specific value during the compilation process. W takim przypadku zmusza procesor zapytań do ignorowania wartości, która jest przesyłana jako parametr, a zamiast tego UNKNOWN .In this case, it forces the query processor to ignore the value that is passed as the parameter, and instead to assume UNKNOWN. Odnosi się do wartości, która ma średnią częstotliwość w tabeli (ignorowanie pochylenia).This refers to a value that has the average frequency in the table (ignoring skew). Powstały plan jest planem opartym na wyszukiwaniach, który jest szybszy i używa mniejszej ilości zasobów, średnio od planu w części 1 tego przykładu:The resulting plan is a seek-based plan that is faster and uses fewer resources, on average, than the plan in part 1 of this example:

Dostrajanie zapytania przy użyciu podpowiedzi zapytania

Efekt można zobaczyć w tabeli sys. resource_stats (istnieje opóźnienie od momentu wykonania testu oraz momentu, gdy dane wypełniają tabelę).You can see the effect in the sys.resource_stats table (there is a delay from the time that you execute the test and when the data populates the table). W tym przykładzie część 1 została wykonana w przedziale czasu 22:25:00, a część 2 została uruchomiona o 22:35:00.For this example, part 1 executed during the 22:25:00 time window, and part 2 executed at 22:35:00. Wcześniej przedział czasu użył więcej zasobów w tym przedziale czasu niż później (z powodu ulepszeń planu).The earlier time window used more resources in that time window than the later one (because of plan efficiency improvements).

SELECT TOP 1000 *
FROM sys.resource_stats
WHERE database_name = 'resource1'
ORDER BY start_time DESC

Przykładowe wyniki strojenia zapytania

Uwaga

Chociaż wolumin w tym przykładzie jest celowo mały, wpływ parametrów optymalnych może być istotny, szczególnie w przypadku większych baz danych.Although the volume in this example is intentionally small, the effect of sub-optimal parameters can be substantial, especially on larger databases. Różnica w skrajnych przypadkach może wynosić od sekund dla szybkich przypadków i godzin w przypadku wolnych przypadków.The difference, in extreme cases, can be between seconds for fast cases and hours for slow cases.

Możesz sprawdzić, czy sys. resource_stats , aby określić, czy zasób dla testu używa więcej lub mniej zasobów niż inny test.You can examine sys.resource_stats to determine whether the resource for a test uses more or fewer resources than another test. Podczas porównywania danych należy oddzielić chronometraż testów, tak aby nie były w tym samym oknie 5-minutowym w widoku sys. resource_stats .When you compare data, separate the timing of tests so that they are not in the same 5-minute window in the sys.resource_stats view. Celem ćwiczenia jest zminimalizowanie łącznej ilości używanych zasobów, a nie zminimalizowanie zasobów szczytowych.The goal of the exercise is to minimize the total amount of resources used, and not to minimize the peak resources. Ogólnie Optymalizacja fragmentu kodu do opóźnienia zmniejsza również zużycie zasobów.Generally, optimizing a piece of code for latency also reduces resource consumption. Upewnij się, że zmiany wprowadzane do aplikacji są niezbędne i że zmiany nie wpłyną negatywnie na wrażenia klienta dla kogoś, kto może korzystać z podpowiedzi zapytania w aplikacji.Make sure that the changes you make to an application are necessary, and that the changes don't negatively affect the customer experience for someone who might be using query hints in the application.

Jeśli obciążenie zawiera zestaw powtarzających się zapytań, często warto przechwycić i sprawdzić Optymalność opcji planu, ponieważ obejmuje ona minimalną jednostkę rozmiaru zasobu wymaganą do hostowania bazy danych programu.If a workload has a set of repeating queries, often it makes sense to capture and validate the optimality of your plan choices because it drives the minimum resource size unit required to host the database. Po sprawdzeniu poprawności należy ponownie sprawdzić plany, aby upewnić się, że nie zostały one obniżone.After you validate it, occasionally reexamine the plans to help you make sure that they have not degraded. Więcej informacji na temat wskazówek dotyczących zapytań (Transact-SQL).You can learn more about query hints (Transact-SQL).

Bardzo duże architektury baz danychVery large database architectures

Przed udostępnieniem warstwy usługi w warstwie górnej dla pojedynczych baz danych w Azure SQL Database klienci korzystający z limitów pojemności dla poszczególnych baz danych.Before the release of Hyperscale service tier for single databases in Azure SQL Database, customers used to hit capacity limits for individual databases. Te limity pojemności nadal istnieją dla baz danych w puli w Azure SQL Database pul elastycznych i bazach danych wystąpień w wystąpieniach zarządzanych usługi Azure SQL.These capacity limits still exist for pooled databases in Azure SQL Database elastic pools and instance databases in Azure SQL Managed Instances. W poniższych dwóch sekcjach omówiono dwie opcje rozwiązywania problemów z bardzo dużymi bazami danych w systemie Azure SQL Database i wystąpieniem zarządzanym usługi Azure SQL, gdy nie można użyć warstwy usług.The following two sections discuss two options for solving problems with very large databases in Azure SQL Database and Azure SQL Managed Instance when you cannot use the Hyperscale service tier.

Fragmentowania między bazami danychCross-database sharding

Ponieważ Azure SQL Database i usługa Azure SQL Managed instance jest uruchamiana na sprzęcie z asortymentu, limity pojemności dla pojedynczej bazy danych są mniejsze niż dla tradycyjnej instalacji SQL Server lokalnych.Because Azure SQL Database and Azure SQL Managed Instance runs on commodity hardware, the capacity limits for an individual database are lower than for a traditional on-premises SQL Server installation. Niektórzy klienci używają technik fragmentowania, aby rozłożyć operacje bazy danych na wiele baz danych, gdy operacje nie mieszczą się w granicach pojedynczej bazy danych w Azure SQL Database i wystąpieniu zarządzanym Azure SQL.Some customers use sharding techniques to spread database operations over multiple databases when the operations don't fit inside the limits of an individual database in Azure SQL Database and Azure SQL Managed Instance. Większość klientów korzystających z technik fragmentowania w Azure SQL Database i wystąpieniu zarządzanym usługi Azure SQL dzieli swoje dane w jednym wymiarze w wielu bazach danych.Most customers who use sharding techniques in Azure SQL Database and Azure SQL Managed Instance split their data on a single dimension across multiple databases. Dla tego podejścia należy zrozumieć, że aplikacje OLTP często wykonują transakcje, które są stosowane tylko do jednego wiersza lub do niewielkiej grupy wierszy w schemacie.For this approach, you need to understand that OLTP applications often perform transactions that apply to only one row or to a small group of rows in the schema.

Uwaga

Azure SQL Database teraz udostępnia bibliotekę ułatwiającą fragmentowania.Azure SQL Database now provides a library to assist with sharding. Aby uzyskać więcej informacji, zobacz Elastic Database Omówienie biblioteki klienta.For more information, see Elastic Database client library overview.

Jeśli na przykład baza danych ma nazwę klienta, zamówienie i szczegółowe informacje o zamówieniu (takie jak tradycyjna Przykładowa baza danych Northwind, która jest dostarczana z SQL Server), można podzielić te dane na wiele baz danych, grupując klienta z pokrewnymi informacjami o zamówieniu i kolejności.For example, if a database has customer name, order, and order details (like the traditional example Northwind database that ships with SQL Server), you could split this data into multiple databases by grouping a customer with the related order and order detail information. Możesz zagwarantować, że dane klienta pozostają w pojedynczej bazie danych.You can guarantee that the customer's data stays in an individual database. Aplikacja będzie dzielić różne klientów między bazami danych, efektywnie rozłożyć obciążenie między wiele baz danych.The application would split different customers across databases, effectively spreading the load across multiple databases. W przypadku usługi fragmentowania klienci nie tylko mogą uniknąć maksymalnego limitu rozmiaru bazy danych, ale Azure SQL Database i wystąpienie zarządzane usługi Azure SQL mogą także przetwarzać obciążenia, które są znacznie większe niż limity różnych rozmiarów obliczeniowych, o ile każda z poszczególnych baz danych jest zgodna z limitami warstwy usługi.With sharding, customers not only can avoid the maximum database size limit, but Azure SQL Database and Azure SQL Managed Instance also can process workloads that are significantly larger than the limits of the different compute sizes, as long as each individual database fits into its service tier limits.

Mimo że usługa Database fragmentowania nie zmniejsza zagregowanej pojemności zasobów dla rozwiązania, jest wysoce wydajna, aby obsługiwać bardzo duże rozwiązania, które są rozłożone na wiele baz danych.Although database sharding doesn't reduce the aggregate resource capacity for a solution, it's highly effective at supporting very large solutions that are spread over multiple databases. Każda baza danych może działać z innym rozmiarem obliczeniowym w celu obsługi bardzo dużych, "efektywnych" baz danych o wysokich wymaganiach dotyczących zasobów.Each database can run at a different compute size to support very large, "effective" databases with high resource requirements.

Partycjonowanie funkcjonalneFunctional partitioning

Użytkownicy często łączą wiele funkcji w pojedynczej bazie danych.Users often combine many functions in an individual database. Na przykład jeśli aplikacja ma logikę do zarządzania zapasami dla magazynu, ta baza danych może być skojarzona z spisem, śledzeniem zamówień zakupu, procedurami składowanymi oraz widokami indeksowanymi lub z materiałami, które zarządzają raportami końcowymi.For example, if an application has logic to manage inventory for a store, that database might have logic associated with inventory, tracking purchase orders, stored procedures, and indexed or materialized views that manage end-of-month reporting. Ta technika ułatwia administrowanie bazą danych dla operacji, takich jak tworzenie kopii zapasowej, ale wymaga również zmiany rozmiaru sprzętu w celu obsługi szczytowego obciążenia we wszystkich funkcjach aplikacji.This technique makes it easier to administer the database for operations like backup, but it also requires you to size the hardware to handle the peak load across all functions of an application.

W przypadku używania architektury skalowalnego w poziomie w Azure SQL Database i wystąpieniu zarządzanym usługi Azure SQL warto podzielić różne funkcje aplikacji do różnych baz danych.If you use a scale-out architecture in Azure SQL Database and Azure SQL Managed Instance, it's a good idea to split different functions of an application into different databases. Korzystając z tej techniki, każda aplikacja skaluje się niezależnie.By using this technique, each application scales independently. Gdy aplikacja stanie się busier (a obciążenie bazy danych wzrasta), administrator może wybrać niezależne rozmiary obliczeń dla każdej funkcji w aplikacji.As an application becomes busier (and the load on the database increases), the administrator can choose independent compute sizes for each function in the application. W ramach tej architektury, aplikacja może być większa niż pojedynczy komputer z asortymentem, może obsłużyć, ponieważ obciążenie jest rozłożone na wiele maszyn.At the limit, with this architecture, an application can be larger than a single commodity machine can handle because the load is spread across multiple machines.

Zapytania wsadoweBatch queries

W przypadku aplikacji, które uzyskują dostęp do danych przy użyciu dużych, częstych zapytań ad hoc, dużo czasu odpowiedzi poświęca się na komunikację sieciową między warstwą aplikacji a warstwą bazy danych.For applications that access data by using high-volume, frequent, ad hoc querying, a substantial amount of response time is spent on network communication between the application tier and the database tier. Nawet jeśli zarówno aplikacja, jak i baza danych znajdują się w tym samym centrum danych, opóźnienie sieci między tymi dwoma może być powiększone przez dużą liczbę operacji dostępu do danych.Even when both the application and the database are in the same data center, the network latency between the two might be magnified by a large number of data access operations. Aby zmniejszyć liczbę podróży sieci dla operacji dostępu do danych, należy rozważyć użycie opcji do wsadowych zapytań ad hoc lub skompilować je jako procedury składowane.To reduce the network round trips for the data access operations, consider using the option to either batch the ad hoc queries, or to compile them as stored procedures. W przypadku wsadowych zapytań ad hoc można wysyłać wiele zapytań jako jedną dużą partię do bazy danych.If you batch the ad hoc queries, you can send multiple queries as one large batch in a single trip to the database. W przypadku kompilowania zapytań ad hoc w procedurze składowanej można osiągnąć ten sam wynik, jak w przypadku przetwarzania wsadowego.If you compile ad hoc queries in a stored procedure, you could achieve the same result as if you batch them. Użycie procedury składowanej umożliwia również zwiększenie ryzyka buforowania planów zapytania w bazie danych, aby można było ponownie użyć procedury składowanej.Using a stored procedure also gives you the benefit of increasing the chances of caching the query plans in the database so you can use the stored procedure again.

Niektóre aplikacje są czasochłonne.Some applications are write-intensive. Czasami można zmniejszyć łączne obciążenie we/wy w bazie danych, biorąc pod uwagę sposób tworzenia wsadowych zapisów.Sometimes you can reduce the total IO load on a database by considering how to batch writes together. Często jest to proste użycie jawnych transakcji zamiast transakcji automatycznego zatwierdzania w procedurach składowanych i partiach ad hoc.Often, this is as simple as using explicit transactions instead of auto-commit transactions in stored procedures and ad hoc batches. Aby uzyskać ocenę różnych technik, których można użyć, zobacz Przetwarzanie wsadowe dla aplikacji bazy danych na platformie Azure.For an evaluation of different techniques you can use, see Batching techniques for database applications in Azure. Eksperymentuj z własnym obciążeniem, aby znaleźć odpowiedni model na potrzeby tworzenia pakietów wsadowych.Experiment with your own workload to find the right model for batching. Należy pamiętać, że model może mieć nieco inne gwarancje spójności transakcyjnej.Be sure to understand that a model might have slightly different transactional consistency guarantees. Znalezienie odpowiedniego obciążenia, które minimalizuje użycie zasobów, wymaga znalezienia odpowiedniej kombinacji niespójności i wydajności.Finding the right workload that minimizes resource use requires finding the right combination of consistency and performance trade-offs.

Buforowanie w warstwie aplikacjiApplication-tier caching

Niektóre aplikacje bazy danych mają obciążenia z dużą ilością odczytu.Some database applications have read-heavy workloads. Buforowanie warstw może zmniejszyć obciążenie bazy danych i może zmniejszyć rozmiar obliczeń wymaganych do obsługi bazy danych przy użyciu Azure SQL Database i wystąpienia zarządzanego usługi Azure SQL.Caching layers might reduce the load on the database and might potentially reduce the compute size required to support a database by using Azure SQL Database and Azure SQL Managed Instance. W przypadku korzystania z usługi Azure cache for Redis, jeśli masz obciążenie z dużą ilością danych, możesz odczytywać dane raz (lub na komputerach w warstwie aplikacji, w zależności od konfiguracji), a następnie przechowywać te dane poza bazą danych.With Azure Cache for Redis, if you have a read-heavy workload, you can read the data once (or perhaps once per application-tier machine, depending on how it is configured), and then store that data outside of your database. Jest to sposób na zmniejszenie obciążenia bazy danych (we/wy), ale istnieje efekt spójności transakcyjnej, ponieważ dane odczytywane z pamięci podręcznej mogą nie być zsynchronizowane z danymi w bazie danych.This is a way to reduce database load (CPU and read IO), but there is an effect on transactional consistency because the data being read from the cache might be out of sync with the data in the database. Chociaż w wielu aplikacjach jest akceptowalny pewien poziom niespójności, to nie jest prawdą dla wszystkich obciążeń.Although in many applications some level of inconsistency is acceptable, that's not true for all workloads. Przed zaimplementowaniem strategii buforowania w warstwie aplikacji należy dokładnie zrozumieć wszystkie wymagania aplikacji.You should fully understand any application requirements before you implement an application-tier caching strategy.

Następne krokiNext steps