> [!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

V SSMS: **Sort** (zoradenie; logická operácia *Sort* alebo *Distinct Sort*), **Top N Sort** (TOP s ORDER BY) a **Top** (len obmedzí počet riadkov). Pri Sort s problémom uvidíš žltý trojuholník so *Sort Warning* / spill.
## Čo to znamená
**Sort** zoradí vstup podľa stĺpcov (ORDER BY, pre Merge Join, Stream Aggregate, window funkcie, DISTINCT). Je **blokujúci**: prvý riadok odíde až keď prečíta celý vstup. Potrebuje **memory grant** podľa odhadu počtu a veľkosti riadkov; keď sa nevojde, píše do tempdb (**spill**).
**Top** odovzdá prvých N riadkov a potom prestane pýtať ďalšie – operátory napravo sa zastavia skôr (*row goal*). **Top N Sort** kombinuje oboje: zo vstupu si drží len N najlepších riadkov, takže potrebuje oveľa menej pamäte ako plný Sort.
### Do hĺbky
- **Order By** (vlastnosť Sort) – podľa čoho sa triedi. Sort môžeš ušetriť indexom, ktorý dodá dáta v tomto poradí (vrátane smeru – index sa dá čítať aj odzadu, *Scan Direction = BACKWARD*).
- **Distinct Sort** – Sort, ktorý zároveň odstráni duplicity (DISTINCT, UNION).
- Veľkosť grantu závisí aj od **deklarovanej šírky stĺpcov**: `varchar(8000)` alebo `nvarchar(max)` v triedenom výstupe nafúkne grant, aj keď sú hodnoty krátke.
- **Sort Warning / spill level** – koľkokrát sa muselo písať do tempdb ([Spill do tempdb](script.php?id=90&s=spill-do-tempdb-sort-a-hash-warning-memory-grant-feedback)).
- TOP bez ORDER BY nemá zaručené poradie. TOP s ORDER BY na stĺpci bez indexu = Top N Sort cez celý vstup.
- *Row goal* pri TOP mení odhady napravo (optimalizátor predpokladá, že stačí prečítať málo) – ak sú hľadané riadky „na konci“, plán môže byť nečakane pomalý.
## Kedy je to v poriadku / kedy problém
| V poriadku | Problém |
|---|---|
| malý vstup, Sort bez varovania | Sort Warning / spill do tempdb |
| Top N Sort s malým N | plný Sort miliónov riadkov pre ORDER BY, ktorý aplikácia nepotrebuje |
| Sort, ktorý ušetril drahší operátor (napr. pred Stream Aggregate) | obrovský memory grant kvôli širokým stĺpcom |
## Ako si to vyskúšať
```sql
USE PlanLab;
SET STATISTICS IO, TIME ON;
-- 1) Top N Sort: 10 najväčších objednávok (Amount nemá index)
SELECT TOP (10) OrderID, Amount FROM dbo.Orders ORDER BY Amount DESC;
-- 2) Bez Sort: index na OrderDate dodá poradie (čítanie odzadu) + key lookup pre Amount
SELECT TOP (10) OrderID, OrderDate, Amount FROM dbo.Orders ORDER BY OrderDate DESC;
-- 3) Plný Sort všetkých riadkov (pozri Memory Grant Info na SELECT)
SELECT OrderID, Note FROM dbo.Orders ORDER BY Note;
-- 4) Distinct Sort
SELECT DISTINCT City FROM dbo.Customers ORDER BY City;
```
Spusti s **Include Actual Execution Plan** (Ctrl+M). Porovnaj *Memory Grant Info* (Granted, MaxUsed) na SELECT pri bodoch 1 a 3 a pri bode 2 vlastnosť *Scan Direction* na Index Scan.
## Čo s tým
1. Treba to poradie naozaj? ORDER BY, ktorý aplikácia ignoruje, je zbytočný Sort.
2. Ak sa triedi často podľa toho istého: index v poradí ORDER BY (a s INCLUDE stĺpcami) odstráni Sort.
3. Pri spille oprav **odhad** (štatistiky, [table variable](script.php?id=86&s=table-variable-vs-temp-tabulka-odhady-a-deferred-compilation-2019)) a zúž triedené stĺpce. Grant hinty až nakoniec.
4. Pri TOP so zlým row goal pomôže prepis dotazu, prípadne hint `USE HINT('DISABLE_OPTIMIZER_ROWGOAL')`.
## Súvisiace
- [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)
- [Merge Join](script.php?id=72&s=merge-join-spajanie-zoradenych-vstupov)
- [Stream Aggregate vs. Hash Aggregate](script.php?id=76&s=stream-aggregate-vs-hash-aggregate-group-by-v-plane)
- [Kto spotrebúva tempdb](script.php?id=20&s=kto-spotrebuva-tempdb)
## Zdroje
- [Microsoft Learn – Showplan Logical and Physical Operators Reference](https://learn.microsoft.com/sql/relational-databases/showplan-logical-and-physical-operators-reference)
- [Hugo Kornelis – SQL Server Execution Plan Reference (SQLServerFast)](https://sqlserverfast.com/epr/)
- [Paul White – SQLkiwi (články o optimalizátore a operátoroch)](https://www.sql.kiwi/)
- [Microsoft Learn – Query hints (Transact-SQL)](https://learn.microsoft.com/sql/t-sql/queries/hints-transact-sql-query)
_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._Sort, Top a Top N Sort – zoraďovanie a pamäť
Sort, Distinct Sort, Top a Top N Sort v pláne: blokujúce triedenie, memory grant, šírka stĺpcov, Sort Warning (spill), row goal pri TOP a ako Sort ušetriť indexom.