Preskočiť na obsah
Návod

Varovania v pláne – žltý trojuholník (No Join Predicate, No Statistics…)

Katalóg varovaní v exekučnom pláne: No Join Predicate, Columns With No Statistics, implicitná konverzia, Unmatched Indexes, spill, Excessive Grant a ďalšie – kde ich nájsť a čo s nimi.

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

![Katalóg varovaní v pláne](uploads/2026/11/plan-p13.svg "Varovania z kompilácie vidno aj v odhadovanom pláne, z behu len v skutočnom")

**Žltý trojuholník s výkričníkom** pri operátore alebo pri SELECT. Text je vo vlastnosti **Warnings** (F4) alebo v tooltipe. Varovania z **kompilácie** vidíš aj v odhadovanom pláne, varovania z **behu** len v skutočnom.

## Čo to znamená

Varovanie je optimalizátorova poznámka „tu sa deje niečo, čo pravdepodobne nechceš“. Nie každé je problém, ale každé stojí za pohľad.

### Do hĺbky – katalóg

- **No Join Predicate** (Nested Loops) – spojenie bez podmienky = karteziánsky súčin. Často chýbajúca podmienka v JOIN (preklep, zabudnutý stĺpec) alebo starý zápis `FROM a, b`. Niekedy je falošné: podmienka sa presunula inde (napr. `a.x = 5 AND b.x = 5`), vtedy skontroluj počty riadkov.
- **Columns With No Statistics** – optimalizátor nemá štatistiku stĺpca (vypnuté `AUTO_CREATE_STATISTICS`, read-only databáza bez štatistík). Odhady sú hádané. Zapni auto create alebo vytvor štatistiku ručne.
- **Type conversion in expression … may affect "SeekPlan" / "CardinalityEstimate"** – [implicitná konverzia](script.php?id=88&s=implicitna-konverzia-convert-implicit-varchar-vs-nvarchar).
- **Unmatched Indexes** – filtrovaný index nešlo použiť pre parametrizovaný dotaz (hodnota parametra nie je známa pri kompilácii).
- **SpillToTempDb / Sort Warnings / Hash Warning** – [spill do tempdb](script.php?id=90&s=spill-do-tempdb-sort-a-hash-warning-memory-grant-feedback). Pri exchange operátore *Exchange spill* ([paralelizmus](script.php?id=79&s=paralelizmus-v-plane-distribute-repartition-a-gather-streams)).
- **Excessive Grant / Grant Increase / Used More Than Granted** – [memory grant](script.php?id=91&s=memory-grant-kolko-pamate-dostal-dotaz-privela-alebo-primalo) nesedel.
- **Wait** (MemoryGrant) na SELECT – dotaz čakal na pridelenie pamäte (*GrantWaitTime*).
- **Plan affecting convert**, **Spatial guess**, **Full update for online index build** a ďalšie zriedkavé – popis je v dokumentácii showplanu.
- **Missing Index** (zelený text) nie je varovanie, ale návrh – [Chýbajúci index v pláne](script.php?id=92&s=chybajuci-index-v-plane-zeleny-text-preco-ho-nebrat-naslepo).

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

| Väčšinou v poriadku | Vždy preskúmaj |
|---|---|
| konverzia vo výstupnom stĺpci (CardinalityEstimate) | No Join Predicate pri veľkých tabuľkách |
| No Join Predicate pri spojení s jednoriadkovým výsledkom | spill pri častom dotaze |
| | Columns With No Statistics |

## Ako si to vyskúšať

```sql
USE PlanLab;
-- 1) No Join Predicate: zabudnutá podmienka (TOP, aby sa nevrátilo 6 miliárd riadkov)
SELECT TOP (100) c.Name, o.OrderID FROM dbo.Customers AS c, dbo.Orders AS o WHERE c.CustomerID < 3;

-- 2) Konverzia: varovanie SeekPlan
SELECT OrderID FROM dbo.Orders WHERE AccountCode = N'AC000123';

-- 3) Columns With No Statistics: vypnuté automatické štatistiky (len v PlanLab), stĺpec Note bez štatistiky
ALTER DATABASE PlanLab SET AUTO_CREATE_STATISTICS OFF;
SELECT COUNT(*) FROM dbo.Orders WHERE Note = 'expres';
ALTER DATABASE PlanLab SET AUTO_CREATE_STATISTICS ON;
```

Zobraz **odhadovaný** plán (Ctrl+L) – všetky tri varovania sú z kompilácie. Ak bod 3 varovanie neukáže, štatistika na stĺpci Note už vznikla skôr (pozri `sys.stats`).

## Čo s tým

1. Prejdi všetky trojuholníky v pláne (F4 → Warnings) – sú to najlacnejšie stopy.
2. No Join Predicate: doplň podmienku, preveď starý zápis na `JOIN … ON`.
3. Štatistiky: nechaj `AUTO_CREATE_STATISTICS` a `AUTO_UPDATE_STATISTICS` zapnuté, pravidelná údržba.
4. Varovania z behu (spill, grant) rieš cez odhady – recepty vyššie.

## Súvisiace

- [Implicitná konverzia](script.php?id=88&s=implicitna-konverzia-convert-implicit-varchar-vs-nvarchar)
- [Spill do tempdb](script.php?id=90&s=spill-do-tempdb-sort-a-hash-warning-memory-grant-feedback)
- [Memory grant](script.php?id=91&s=memory-grant-kolko-pamate-dostal-dotaz-privela-alebo-primalo)
- [Chýbajúci index v pláne](script.php?id=92&s=chybajuci-index-v-plane-zeleny-text-preco-ho-nebrat-naslepo)
- [Štatistiky – posledný update](script.php?id=29&s=statistiky-posledny-update-a-pocet-zmien)

## Zdroje

- [Microsoft Learn – Showplan Logical and Physical Operators Reference](https://learn.microsoft.com/sql/relational-databases/showplan-logical-and-physical-operators-reference)
- [Microsoft Learn – Statistics](https://learn.microsoft.com/sql/relational-databases/statistics/statistics)
- [Hugo Kornelis – SQL Server Execution Plan Reference (SQLServerFast)](https://sqlserverfast.com/epr/)
- [Grant Fritchey – SQL Server Execution Plans, 3. vydanie (Redgate, e-kniha zadarmo)](https://www.red-gate.com/simple-talk/books/sql-server-execution-plans-third-edition/)

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