Preskočiť na obsah
Návod

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.

4 min čítania 4 kroky 1 obrázok SQL Server 2016+
> [!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

![Rozhodovanie o paralelnom pláne](uploads/2026/11/plan-p10.svg "Cost threshold rozhodne, či sa paralelizmus zváži; MAXDOP koľko vlákien")

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._