DBCC freeproccache?

a kérdések az egész hely, így megpróbálom kezelni őket. Az eljárás gyorsítótára csak olyan nagy. Előfordulhat, hogy az eljárás gyorsítótárát egyszer használatos tervek töltötték ki (ez nincs hatással a statisztikákra, bár a statisztikák befolyásolhatják a terv gyorsítótárát). Az egyszer használatos tervekről sok részletet olvashat Kimberly Tripp “gyorsítótár tervezése és optimalizálása az adhoc munkaterhelésekhez” című blogbejegyzésében – beleértve a sys.dm_exec_cached_plans lekérdezést is, amely segít azonosítani, ha a gyorsítótár sok egyszer használatos tervvel van feltöltve. Amint azt javasolja, megakadályozhatja ezt a puffadást az optimize for ad hoc munkaterhelések használatával. Ha úgy találja, hogy ezt gyakran meg kell tennie, azt mondanám, hogy a freeproccache munkaként történő ütemezése sebtapasz, nem megoldás.

a “rossz” terv törléséhez először meg kell határoznia a “rossz” tervet. Ez lehet egy olyan terv, amely meghalad egy bizonyos méretet és / vagy egy ideje nem került végrehajtásra, vagy amelyet egy régóta futó lekérdezés azonosított stb. Sajnos nem egyszerű azonosítani egy olyan tervet, amely a paraméterek szippantásának áldozata, hacsak nem ismeri már az érintett lekérdezést vagy lekérdezéseket. Tegyük fel, hogy meg akarja találni a gyorsítótárban a legrégebbi terveket, amelyeket több mint egy hete nem futtattak:

;WITH x AS ( SELECT TOP 10 qs., qs.plan_handle, txs = qs.statement_start_offset, txe = qs.statement_end_offset, = cp.size_in_bytes, = SUM(cp.usecounts), = MAX(qs.last_execution_time) FROM sys.dm_exec_query_stats AS qs INNER JOIN sys.dm_exec_cached_plans AS cp ON qs.plan_handle = cp.plan_handle WHERE qs.last_execution_time < DATEADD(DAY, -7, CURRENT_TIMESTAMP) GROUP BY qs., qs.plan_handle, cp.size_in_bytes, qs.statement_start_offset, qs.statement_end_offset ORDER BY DESC) SELECT x.plan_handle, size, uses, , = COALESCE(NULLIF( SUBSTRING(t., x.txs/2, CASE WHEN x.txe = -1 THEN 0 ELSE (x.txe - x.txs)/2 END ), ''), t.) FROM x CROSS APPLY sys.dm_exec_sql_text(x.) AS t;

most ellenőriznie kell, hogy valóban ki akarja-e törölni ezt a tervet. Például, ha felismeri ezt a lekérdezést, mint amit a vezérigazgató holnap futtathat, talán a legjobb, ha ott hagyja. Ha törölni szeretné a tervet, akkor közvetlenül törölheti azt:

DBCC FREEPROCCACHE();

ez sokkal több munkának hangzik, mint a DBCC FREEPROCCACHE globális futtatása, de ha sok jó terv van a gyorsítótárban, akkor ez minden bizonnyal jobb lesz a felhasználók számára.

mégis, ez tényleg úgy hangzik, mint egy ragtapasz. Ha a gyorsítótár tele van szeméttel, és a teljesítmény addig megy a WC-ben, amíg fel nem szabadítja a gyorsítótárat, akkor magasabb szintre kell néznie az architektúrát, a lekérdezések benyújtásának módját stb. Ez az a viselkedés, amit elvárnék a LINQ2SQL legelső iterációjától, ahol minden egyes karakterlánc-argumentumhoz egy lekérdezés tervének egy változatát gyorsítótárazná, amely eltérő hosszúságú volt. Tehát, ha a ‘január’ paraméterrel rendelkezne, akkor más tervet kapna, mint a ‘február’ paraméterrel, mert az az adattípust VARCHAR(7) vs. VARCHAR(8). Biztos vagyok benne, hogy a viselkedés rögzített, de nem tudok eleget a környezetéről / alkalmazásáról, hogy javasoljam, hol kell pontosan keresni a “rossz ötleteket”.”