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.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLDatabáze SQL v Microsoft Fabric
Třída událostí Exchange Pill označuje, že komunikační buffery v paralelním plánu dotazů byly dočasně zapsány do databáze tempdb . To se stává zřídka a pouze tehdy, když má plán dotazu více skenů rozsahu.
Obvykle má Transact-SQL dotaz, který generuje takové rozsahové skeny, mnoho operátorů BETWEEN (meziobrazových), z nichž každý vybírá rozsah řádků z tabulky nebo indexu. Alternativně můžete získat více rozsahů pomocí výrazů jako (T.a > 10 A T.a < 20) NEBO (T.a > 100 A T.a < 120). Navíc plány dotazů musí vyžadovat, aby tyto rozsahy byly procházeny v pořadí, buď proto, že na T.a je klauzule ORDER BY, nebo protože iterátor v rámci plánu vyžaduje, aby tyto n-tice spotřebovával v seřazeném pořadí.
Když má plán dotazu pro takový dotaz více operátorů paralelismu , paměťové komunikační buffery používané operátory paralelismu se naplní a může nastat situace, kdy se postup provádění dotazu zastaví. V této situaci jeden z operátorů paralelismu zapisuje svůj výstupní buffer do tempdb (operace nazývaná exchange spill), aby mohl spotřebovávat řádky z některých svých vstupních bufferů. Nakonec jsou rozlité řádky vráceny spotřebiteli, když je ten připraven je spotřebovat.
Velmi zřídka může v rámci stejného plánu vykonávání dojít k více únikům výměny, což způsobí pomalé provádění dotazu. Pokud si všimnete více než pěti přehazení během provádění stejného plánu dotazů, kontaktujte svého odborníka na podporu.
Úniky výměn jsou někdy přechodné a mohou zmizet s změnou rozložení dat.
Existuje několik způsobů, jak se vyhnout únikům výměn:
Vynechte klauzuli ORDER BY, pokud nepotřebujete, aby byla výsledná sada uspořádána.
Pokud je vyžadováno ORDER BY, odstraňte sloupec, který se účastní vícenásobných skenů vzdálenosti (T.a v příkladu výše) z klauzule ORDER BY.
Pomocí indexové nápovědy donutit optimalizátor použít jinou přístupovou cestu v dané tabulce.
Přepiš dotaz tak, aby vznikl jiný plán provádění dotazu.
Vynuťte sériové provedení dotazu přidáním možnosti MAXDOP = 1 na konec operace dotazu nebo indexu. Pro více informací viz Konfigurace maximálního stupně paralelismu v Konfiguraci serveru a Konfigurace paralelních indexových operací.
Důležité
Abychom zjistili, kde se událost Exchange Pill odehrává při generování plánu provádění dotazu, měli byste také v trace shromáždit třídu události Showplan. Můžete si vybrat jakoukoli z tříd událostí Showplan kromě tříd Showplan Texta Showplan Text (Unencoded), které nevrací ID uzlu. ID uzlů v Showplanech identifikují každou operaci, kterou optimalizátor dotazu provede při generování plánu provádění dotazu. Tyto operace se nazývají operátory a každý operátor v Showplanu má ID uzlu. Sloupec ObjectID pro Exchange Spill události odpovídá ID Node v Showplans, takže můžete určit, který operátor nebo operace způsobuje chybu.
Sloupce tříd tříd událostí výměny
| Název datového sloupce | Datový typ | Description | ID sloupce | Filtrovatelný |
|---|---|---|---|---|
| Název aplikace | nvarchar | Název klientské aplikace, která vytvořila připojení k instanci SQL Serveru. Tento sloupec se naplní hodnotami předanými aplikací místo zobrazovaného názvu programu. | 10 | Ano |
| ClientProcessID | int | ID přiřazené hostitelským počítačem procesu, ve kterém je klientská aplikace spuštěná. Tento datový sloupec se vyplní, pokud klient poskytne ID klientského procesu. | 9 | Ano |
| DatabaseID | int | ID databáze specifikované příkazem USE database nebo výchozí databáze, pokud pro danou instanci nebyl vydán žádný příkaz USE databáze . SQL Server Profiler zobrazuje název databáze, pokud je sloupec dat ServerName zachycen v trace a server je dostupný. Pomocí funkce DB_ID určete hodnotu databáze. | 3 | Ano |
| DatabaseName | nvarchar | Název databáze, ve které je spuštěný uživatelský příkaz. | 35 | Ano |
| EventClass | int | Typ události = 127. | 27 | Ne |
| EventSequence | int | Posloupnost dané události v rámci požadavku | 51 | Ne |
| EventSubClass | int | Typ podtřídy události. 1=Začátek úniku 2=Konec úniku |
21 | Ano |
| GroupID | int | ID skupiny úloh, ve které se aktivuje událost trasování SQL. | 66 | Ano |
| Název hostitele | nvarchar | Název počítače, na kterém je klient spuštěný. Tento datový sloupec se vyplní, pokud klient zadá hostitelské jméno. Pro určení názvu hostitele použijte funkci HOST_NAME. | 8 | Ano |
| IsSystem | int | Určuje, jestli došlo k události v systémovém procesu nebo uživatelském procesu. 1 = systém, 0 = uživatel. | 60 | Ano |
| Přihlásit se | nvarchar | Název přihlášení uživatele (buď SQL Server Security Login, nebo přihlašovací údaje Windows ve formě <DOMAIN>\<username>). | 11 | Ano |
| LoginSid | image | Identifikační číslo zabezpečení (SID) přihlášeného uživatele. Tyto informace najdete v tabulce sysloginshlavní databáze . Každý identifikátor SID je jedinečný pro každé přihlášení na serveru. | 41 | Ano |
| NTDomainName | nvarchar | Doména Systému Windows, do které uživatel patří. | 7 | Ano |
| NTUserName | nvarchar | Uživatelské jméno systému Windows. | 6 | Ano |
| ObjectID | int | Systémově přiřazené ID objektu. Odpovídá ID uzlu v Showplans. | 22 | Ano |
| RequestID | int | ID požadavku obsahujícího příkaz. | 49 | Ano |
| název serveru | nvarchar | Název instance systému SQL Server, která se trasuje. | 26 | Ne |
| SessionLoginName | nvarchar | Přihlašovací jméno uživatele, který relaci pochází. Například pokud se připojíte ke SQL Serveru pomocí Login1 a vykonáte příkaz jako Login2, SessionLoginName ukáže Login1 a LoginName Login2. Tento sloupec zobrazuje přihlášení k SQL Serveru i Windows. | 64 | Ano |
| SPID | int | ID relace, na které došlo k události. | 12 | Ano |
| Počáteční čas | datetime | Čas, kdy událost začala, pokud je k dispozici. | 14 | Ano |
| TransactionID | bigint | ID transakce přiřazené systémem. | 4 | Ano |
| XactSequence | bigint | Token, který popisuje aktuální transakci. | 50 | Ano |