> [!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  **Ž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._
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.