Eltávolítás az egyes lekérdezési tervek eljárási gyorsítótárából,

Ebben a rövid megjegyzésben azt szeretném megosztani, hogyan lehet eltávolítani az adott lekérdezési terveket az eljárási gyorsítótárból. Mikor születik ilyen igény? Például egy tárolt eljárást olyan paraméterrel futtattunk, amely a tárolt eljárás szuboptimális lekérdezési tervét eredményezte. Valószínűleg ebben a konkrét esetben a terv optimális, de gyakrabban ezt az eljárást egyáltalán használják más paraméterekkel, amelyek esetében a terv már nem lesz optimális. Természetesen meg kell dolgozni egy ilyen eljárást, és kéri, hogy biztosítsák, hogy az ilyen események nem ismétlődnek meg, de abban a pillanatban el kell távolítani a lekérdezési terv a gyorsítótárból, hogy egy új tárolt eljárást vezetett összeállításáról és megalakult a kívánt tervet. Természetesen nem szeretnénk más terveket befolyásolni a gyorsítótárban, hogy ne okozzunk nagy mennyiségű újrafordítást a kéréseknek és a felesleges terhelésnek.

Az egyik lehetőség, maga a tárolt eljárást is megváltoztathatja. Például az Objektum Explorerben válasszon ki egy tárolt eljárást, készítsen egy Script Store eljárást mint -> ALTER -> Új lekérdezési ablak és hajtsa végre a történteket.

Eltávolítás az egyes lekérdezési tervek eljárási gyorsítótárából,

Szkript tárolt eljárás

Ez a következő lépés, amikor elindítja a tárolt eljárást, újrafordítja. A módszer nagyon egyszerű és gyors, de hátránya van: ez a modify_date mező módosítását eredményezi a sys.objects rendszer nézetben, bár valójában nem tettünk semmilyen változtatást.

Variant második, bonyolultabb, hogy egy vizsgálat, hogy a rendszer nyugalmi sys.dm_exec_cached_plans, hogy megkapjuk a kívánt fogantyút (fogantyúk) szuboptimális tervek és távolítsa el őket a gyorsítótárból DBCC FREEPROCCACHE. Például a vizsgálati adatbázisban ilyen kérést fogok és kapok a field_handle mező értékét.