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

Proč parametrizovaný dotaz vytváří mnohem pomalejší plán dotazů ve srovnání s neparametrizovaným dotazem

Zdá se, že plánovač dotazů učinil rozhodnutí v doslovném dotazu, které je založeno na informacích, které již má. Měl by statistiky, které by mohl efektivně dotazovat na základě rozložení dat uvedených ve vašem konkrétním literálu.

Parametrizovaný dotaz zvolil dotaz, který je podle něj nejspravedlivější pro všechna data ve vaší tabulce, což, jak si všimnete, obsahuje mnoho vnořených smyček (výkon =špatný).

Možná byste mohli zkusit spustit nástroje pro optimalizaci databáze ve vaší databázi, abyste zjistili, zda by vám zde mohly pomoci nějaké indexy?

Konkrétně ve svém dotazu zkuste toto:

declare @p0 int
set @p0 = 1000
select *
from foo
join bar on bar.x = foo.x
join baz on baz.y = foo.y
where foo.x = @p0
OPTION ( OPTIMIZE FOR (@p0 = 1000))

Ale byl bych opatrný, abych to udělal, aniž bych si byl jistý, že data obsažená v tomto dotazu se nezmění a že váš dotaz na tento plán bude VŽDY efektivnější.



  1. Úvod do referenčních kurzorů PL/SQL v databázi Oracle

  2. Flask by example – Nastavení Postgres, SQLAlchemy a Alembic

  3. Databáze SQLite poskytuje varovný automatický index na <název_tabulky> (sloupec) Po upgradu systému Android L

  4. Začínáme s Cloud Firestore pro iOS