sql >> Databáze >  >> RDS >> Sqlserver

Použití proměnných v dotazu generuje jiný plán dotazů

Protože když používáte FIXED hodnoty s vypnutou AUTO-PARAMETERIZATION, pak plán dotazů přesně ví, pro jakou hodnotu potřebuje spustit dotaz. Takže plán je naladěn KONKRÉTNĚ na tyto hodnoty.

Když však používáte proměnné, plán, který bude vložen do mezipaměti dotazů, je ten, který obsahuje parametrizované proměnné – které lze nahradit libovolnou proměnnou a znovu použije stejný plán. Tyto plány proto budou muset být robustnější a obecnější, aby zvládly „nejlepší průměrný případ“.

V SQL Server 2008 můžete nastavit, zda budou jednoduché parametry automaticky parametrizovány, takže získáte konzistentně plán „nejlepšího průměrného případu“ – se všemi jeho dobrými i špatnými vlastnostmi.

Ref:

UPRAVIT – podle výkonu

Pokud jde o výkon, optimalizátor se může mýlit - v tomto případě se podíval na statistiky for the exact values a cítil jsem, že index není užitečný (může to být problém s bodem zlomu), takže plán je místo toho pro skenování v clusteru. Je uměním určit, zda vynutit plán dotazů – ale použití indexu je zjevně o 50 % rychlejší pro

  1. konkrétní hardware
  2. rozdělení údajů v konkrétním okamžiku
  3. uvedené konkrétní hodnoty

Pokud k tomu nemám velmi dobrý důvod, nehrál bych s Optimalizátorem dotazů (např. pomocí indexových rad), pokud nebudu mít spoustu dat, abych dokázal, že to vždy urychlí.




  1. Zdroj nenalezen Soubor JAR mysql-connector-java-5.1.20-bin.jar nemá žádnou zdrojovou přílohu

  2. Postgres vložení nebo aktualizace spouštěče WHEN podmínka (stará)

  3. Seskupit podle rozsahu DATETIME – MySql

  4. Jak získat první a poslední záznam z dotazu SQL?