> [!TIP] > Recept z [kuchárky exekučných plánov](script.php?id=64&s=exekucne-plany-kucharka-zacni-tu). Ukážky bežia v testovacej databáze [PlanLab](script.php?id=65&s=planlab-testovacia-databaza-pre-recepty-exekucnych-planov) – nikdy ich nespúšťaj na produkcii. ## Ako to vyzerá v pláne  Na SELECT: **Degree of Parallelism** (skutočný počet vlákien) alebo **NonParallelPlanReason**, ak plán paralelný byť nemohol. Paralelné operátory majú žlté koliesko so šípkami ([Paralelizmus v pláne](script.php?id=79&s=paralelizmus-v-plane-distribute-repartition-a-gather-streams)). Na serveri sa paralelizmus prejaví čakaniami **CXPACKET / CXCONSUMER**. ## Čo to znamená SQL Server zváži paralelný plán, keď **odhadovaný náklad** sériového plánu prekročí **cost threshold for parallelism** (predvolene 5 – hodnota z dôb dávno minulých). Počet vlákien obmedzuje **MAXDOP**. Zle nastavené hodnoty vedú k tomu, že aj malé časté dotazy idú paralelne – zbytočne zaberajú vlákna a CPU. ### Do hĺbky - **Cost threshold for parallelism** – serverové nastavenie (`sp_configure`). Bežná prax je začať okolo 30–50 a ladiť podľa nákladov dôležitých dotazov; Microsoft konkrétnu hodnotu nepredpisuje. - **MAXDOP** – server (`sp_configure`), od 2016 aj databáza (`ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = n`), Resource Governor, hint `OPTION (MAXDOP n)`. Odporúčania podľa NUMA uzlov a jadier sú v dokumentácii; inštalácia SQL Server 2019+ navrhne hodnotu sama. - **CXPACKET** = vlákna čakajú pri výmene riadkov; **CXCONSUMER** (od 2016 SP2 / 2017 CU3) = konzument čaká na producenta, väčšinou neškodné. Vysoké CXPACKET je **symptóm** (skew, zlé odhady, priveľa paralelizmu), nie príčina na „MAXDOP 1 všade“. - **DOP feedback** (SQL Server 2022, compat 160, vyžaduje Query Store) – postupne zníži DOP pre opakované dotazy, ktorým veľa vlákien nepomáha; v 2022 je predvolene vypnutý (`DOP_FEEDBACK`). - Časté **NonParallelPlanReason**: `MaxDOPSetToOne`, `EstimatedDOPIsOne`, `NoParallelPlansInDesktopOrExpressEdition`, dôvody kvôli scalar UDF ([funkcie](script.php?id=83&s=funkcie-v-plane-scalar-udf-inlining-2019-a-table-valued-funkcie)), table variable modifikácii a ďalšie. ## Kedy je to v poriadku / kedy problém | V poriadku | Problém | |---|---| | veľké reporty a údržba paralelne | stovky malých dotazov za sekundu s DOP 8 | | CXCONSUMER vedľa iných čakaní | CXPACKET dominuje a dotazy majú skew | | cost threshold nastavený podľa záťaže | cost threshold 5 a MAXDOP 0 na serveri s 64 jadrami | ## Ako si to vyskúšať ```sql -- aktuálne nastavenie servera (len čítanie) SELECT name, value_in_use FROM sys.configurations WHERE name IN (N'cost threshold for parallelism', N'max degree of parallelism'); USE PlanLab; SELECT name, value FROM sys.database_scoped_configurations WHERE name IN (N'MAXDOP', N'DOP_FEEDBACK'); -- odhadovaný náklad dotazu: pozri na SELECT „Estimated Subtree Cost“ a „Degree of Parallelism“ SELECT ProductID, SUM(Qty * Price) FROM dbo.OrderLines GROUP BY ProductID; -- obmedzenie len pre PlanLab (databázové nastavenie, server sa nemení) ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 2; SELECT ProductID, SUM(Qty * Price) FROM dbo.OrderLines GROUP BY ProductID; ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0; ``` Spusti s **Include Actual Execution Plan** (Ctrl+M). Na SELECT porovnaj *Estimated Subtree Cost* s cost threshold servera a *Degree of Parallelism* pred a po zmene MAXDOP databázy. Serverové nastavenia mení len DBA so súhlasom – v ukážke sa len čítajú. ## Čo s tým 1. Nastav **cost threshold** podľa záťaže (nie 5) a **MAXDOP** podľa dokumentácie (jadrá, NUMA). 2. Pri vysokom CXPACKET hľadaj konkrétne dotazy a ich plány – skew a zlé odhady opravíš tam. 3. Pre OLTP databázu so zmiešanou záťažou pomôže MAXDOP na úrovni databázy alebo Resource Governor. 4. Na 2022+ zváž DOP feedback (Query Store, compat 160). ## Súvisiace - [Paralelizmus v pláne](script.php?id=79&s=paralelizmus-v-plane-distribute-repartition-a-gather-streams) - [Čakanie CXPACKET](waits.php#CXPACKET) - [Čakanie CXCONSUMER](waits.php#CXCONSUMER) - [Identita a konfigurácia inštancie](script.php?id=11&s=identita-a-konfiguracia-instancie) - [Wait stats – na čo server čaká](script.php?id=6&s=wait-stats-na-co-server-caka) ## Zdroje - [Microsoft Learn – Configure the cost threshold for parallelism](https://learn.microsoft.com/sql/database-engine/configure-windows/configure-the-cost-threshold-for-parallelism-server-configuration-option) - [Microsoft Learn – Configure the max degree of parallelism](https://learn.microsoft.com/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option) - [Microsoft Learn – Degree of parallelism (DOP) feedback](https://learn.microsoft.com/sql/relational-databases/performance/intelligent-query-processing-degree-parallelism-feedback) - [Microsoft Learn – sys.dm_os_wait_stats](https://learn.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql) - [Brent Ozar – blog a nástroje First Responder Kit](https://www.brentozar.com/) _Texty sú vlastné, tvrdenia overené proti uvedeným zdrojom (11/2026). T-SQL je staticky skontrolovaný, nie spustený na živom serveri – vyskúšaj ho najprv v PlanLab._
Paralelizmus – cost threshold, MAXDOP a CXPACKET / CXCONSUMER
Kedy SQL Server zvolí paralelný plán: cost threshold for parallelism, MAXDOP (server, databáza, hint), NonParallelPlanReason, čakania CXPACKET a CXCONSUMER a DOP feedback v SQL Server 2022.