Preskočiť na obsah
Návod

Cardinality estimator – CE 70 vs. 120+ a compat level

Legacy a nový cardinality estimator: ako compat level určuje verziu CE, rozdiely v odhadoch (korelácia, hodnoty mimo histogramu, spojenia), prepínanie hintom a CE feedback (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

![Compat level a verzia cardinality estimatora](uploads/2026/11/plan-p2.svg "Compat level databázy určuje verziu CE – vidno ju na SELECT")

Na koreňovom operátore (SELECT) vlastnosť **CardinalityEstimationModelVersion**: `70` = legacy CE, `120` a vyššie = nový CE (číslo podľa compat levelu).

## Čo to znamená

**Cardinality estimator (CE)** je časť optimalizátora, ktorá počíta odhady riadkov. SQL Server 2014 priniesol nový CE s inými predpokladmi. Ktorý sa použije, určuje **compat level databázy** (nie verzia servera). Po upgrade servera alebo zmene compat levelu sa preto **môžu zmeniť plány** – väčšina k lepšiemu, niektoré k horšiemu.

### Do hĺbky

- **Legacy CE (70)**: stĺpce v podmienkach považuje za úplne nezávislé (selektivity násobí), pre hodnoty za koncom histogramu odhaduje 1 riadok, pri spojeniach predpokladá, že každý riadok nájde partnera (*containment*).
- **Nový CE (120+)**: *exponential backoff* pri viacerých podmienkach (predpokladá čiastočnú koreláciu), pre hodnoty mimo histogramu priemernú hustotu, pri spojeniach *base containment*. Pri MSTVF odhad 100 namiesto 1.
- Každý ďalší compat level (130, 140…) môže obsahovať drobné zmeny modelu a zapína ďalšie funkcie [intelligent query processing](script.php?id=74&s=adaptive-join-hash-match-alebo-nested-loops-az-za-behu-2017).
- Prepnúť len CE bez zmeny compat levelu: `ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON` (2016+), pre dotaz `OPTION (USE HINT('FORCE_LEGACY_CARDINALITY_ESTIMATION'))` (2016 SP1+). Opačne `USE HINT('FORCE_DEFAULT_CARDINALITY_ESTIMATION')`.
- `OPTION (USE HINT('QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'))` (2017 CU10+ / 2019) – správanie optimalizátora konkrétneho compat levelu pre jeden dotaz.
- **CE feedback** (SQL Server 2022, compat 160, Enterprise) – pri opakovanom dotaze so zlým odhadom skúsi upraviť predpoklad modelu a výsledok uloží do Query Store. **CE feedback for expressions** pribudlo v SQL Server 2025.

## Kedy je to v poriadku / kedy problém

| V poriadku | Problém |
|---|---|
| po upgrade väčšina dotazov rovnaká alebo rýchlejšia | jeden dôležitý dotaz po zmene compat levelu výrazne pomalší (plan regression) |
| CE verzia zodpovedá compat levelu | databáza ostala na starom compat leveli „na istotu“ roky |

## Ako si to vyskúšať

```sql
USE PlanLab;
SELECT name, compatibility_level FROM sys.databases WHERE name = N'PlanLab';

-- Dve korelované podmienky: Praha je vždy CZ (pozri dáta v PlanLab)
SELECT COUNT(*) FROM dbo.Customers WHERE City = 'Praha' AND Country = 'CZ';

-- Ten istý dotaz s legacy CE
SELECT COUNT(*) FROM dbo.Customers WHERE City = 'Praha' AND Country = 'CZ'
OPTION (USE HINT('FORCE_LEGACY_CARDINALITY_ESTIMATION'));

-- Hodnota mimo histogramu (budúci dátum) – porovnaj odhad oboch CE
SELECT COUNT(*) FROM dbo.Orders WHERE OrderDate > '20261101';
SELECT COUNT(*) FROM dbo.Orders WHERE OrderDate > '20261101' OPTION (USE HINT('FORCE_LEGACY_CARDINALITY_ESTIMATION'));
```

Spusti s **Include Actual Execution Plan** (Ctrl+M) a pri každom pláne pozri na SELECT *CardinalityEstimationModelVersion* a pri skene *Estimated Number of Rows*.

## Čo s tým

1. Pred zmenou compat levelu zapni **Query Store** a nazbieraj baseline. Po zmene porovnaj regresie ([Plan regression](script.php?id=95&s=plan-regression-novy-horsi-plan-a-vynutenie-cez-query-store)).
2. Regresný dotaz rieš cielene: vynútený plán v Query Store, Query Store hint (2022+) alebo USE HINT – nie návratom celej databázy na legacy CE.
3. `LEGACY_CARDINALITY_ESTIMATION = ON` pre celú databázu ber ako dočasnú barličku.
4. Aktuálne compat levely databáz zistíš v [Inventári databáz](script.php?id=12&s=inventar-databaz-recovery-model-compat-level-rcsi).

## Súvisiace

- [Zlé odhady riadkov](script.php?id=84&s=zle-odhady-riadkov-odhad-vs-skutocnost-a-statistiky)
- [Plan regression a Query Store](script.php?id=95&s=plan-regression-novy-horsi-plan-a-vynutenie-cez-query-store)
- [Inventár databáz – compat level](script.php?id=12&s=inventar-databaz-recovery-model-compat-level-rcsi)
- [Query Store – regresie](script.php?id=26&s=query-store-regresie-24-h-vs-predoslych-24-h)

## Zdroje

- [Microsoft Learn – Cardinality Estimation (SQL Server)](https://learn.microsoft.com/sql/relational-databases/performance/cardinality-estimation-sql-server)
- [Microsoft Learn – ALTER DATABASE compatibility level](https://learn.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-compatibility-level)
- [Microsoft Learn – ALTER DATABASE SCOPED CONFIGURATION](https://learn.microsoft.com/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql)
- [Microsoft Learn – Query hints (Transact-SQL)](https://learn.microsoft.com/sql/t-sql/queries/hints-transact-sql-query)
- [Microsoft Learn – Intelligent query processing](https://learn.microsoft.com/sql/relational-databases/performance/intelligent-query-processing)

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