As a continuation of series of posts on Plan caching, let us get started with Part -3 
Earlier posts are given below:
        Plan caching - part-1 - Introduction
        Plan caching - part-2 - What gets cached
Last post explained how stored procedures,prepared statements are cached. But there are a few scenarios where caching doesn't work, and object/query plan in the cache gets recompiled. Recompilation is the process where SQL Server finds that the plan in the cache is no good/invalid and creates a new plan for the query submitted. So lets get started. The following scenarios cause recompilation.
*  A change in the structure/definition of the object 
        If the structure of the stored proc/table(Add/delete column, constraint,  
        index) has changed since last execution then the plan is obviously         
        invalid and hence it has to be recompiled. 
       We are using the same stored procedure test_plan_caching defined in the last post. Consider the following script.
DBCC freeproccache --Clear the cache as usual
EXEC Test_plan_caching 'moscow' --Call the SP
GO
ALTER PROCEDURE [dbo].[Test_plan_caching] @city VARCHAR(50)
AS
  SELECT supplier_xid,
         product_xid,
         trans_city,
         qty,
         comments,
         balance_left
  FROM   supplier_product_customer
  WHERE  trans_city = @city
  ORDER  BY supplier_xid DESC
GO 
--Forcing an alter to the sp, though no logical change has been done 
EXEC Test_plan_caching 'moscow'--Call the SP
SELECT TEXT,
       usecounts,
       size_in_bytes,
       cacheobjtype,
       objtype
FROM   sys.dm_exec_cached_plans
       OUTER APPLY sys.Dm_exec_sql_text(plan_handle) AS sqltext
WHERE  TEXT NOT LIKE '%dm_exec_cached_plans%' 
Alter made on the sp forced the optimizer to recreate the plan.
Similar changes that can cause such recompilations are adding/dropping an index,changing a trigger/proc/view definition etc.
 *  A change in the connection parameters using SET command .
    Changing the following connection parameters using SET keyword can cause recompilation.
    
     ANSI_NULL_DFLT_OFF/ANSI_NULL_DFLT_ON/ANSI_NULLS/ANSI_PADDING/ANSI_WARNINGS
     /ARITHABORT/CONCAT_NULL_YIELDS_NULL/DATEFIRST/DATEFORMAT/FORCEPLAN/LANGUAGE
     /NO_BROWSETABLE/NUMERIC_ROUNDABORT/QUOTED_IDENTIFIER
DBCC freeproccache
GO
EXEC Test_plan_caching 'San Franciso'
GO
SET ansi_null_dflt_off ON
GO
EXEC Test_plan_caching 'San Franciso'
GO 
Query stats DMV clearly shows two plans. One for the plan generated before setting ANSI_NULL_DFLT_OFF and other for the plan with different value on ANSI_NULL_DFLT_OFF.
Note that a change of option 'ANSI_NULL/QUOTED_IDENTIFIER' doesn't affect a Stored proc or Table valued function. But it does affect Adhoc queries or prepared statements.
 * A Forced recompilation 
   When a Object is marked for recompilation using sp_recompile stored procedure or when with recompile hint is used then query is recompiled.
Example:
EXEC Sp_recompile 'test_plan_caching' 
The statement above ensures that next call made to test_plan_caching results in a recomplie.
  When a procedure is created with an option  WITH RECOMPILE, any call made to the stored proc 
  is always recompiled. 
 
  usage of hint  OPTION RECOMPILE   causes a statement level recompilation.
  The scenarios where these options are useful are potential posts on their own. Will cover them soon.
  * A change in statistics, caused by changes done to most of the rows in the table.
    A rough algorithm of how SQL Server decides whether the table needs an updated statistics is given below. The algorithm changes is based on RT factor ( Recompilation threshold ) which depends on the number of changes made to the table. 
            If a table contains less than 500 rows then atleast 500 changes are required to cause a recompilation.If a table has more than 500 rows, then number of changes required are  500 + 20 % of rowcount.
   As the algorithm changes with version and service pack releases, its approximate.  
Friday, April 30, 2010
Plan Cache - Part 3 - What gets recompiled
Subscribe to:
Post Comments (Atom)
 
No comments:
Post a Comment