Login or Sign Up to become a member!
LessThanDot Sit Logo

LessThanDot

Data Management

Less Than Dot is a community of passionate IT professionals and enthusiasts dedicated to sharing technical knowledge, experience, and assistance. Inside you will find reference materials, interesting technical discussions, and expert tips and commentary. Once you register for an account you will have immediate access to the forums and all past articles and commentaries.

LTD Social Sitings

Lessthandot twitter Lessthandot Linkedin Lessthandot friendfeed Lessthandot facebook Lessthandot rss

Note: Watch for social icons on posts by your favorite authors to follow their postings on these and other social sites.

Your profile

    Search

    XML Feeds

    Google Ads

    « When changing column data types use ALTER TABLE TableName ALTER Column syntax, don't drop and recreate columnBe careful when passing around parameters, make sure they are the same size and type »
    comments

    Optimize For Ad Hoc Workloads – Observations......

     

    I’ve been watching this one particular server that has been throwing alerts for high physical memory usage from Red Gate’s SQL Monitoring tool.  I was discussing this with a friend of mine, Clayton Hoyt and he mentioned that I might want to look at the “Optimize for Ad Hoc Workloads” advanced server configuration options.  I took him up on his advice and googled for the “Optimize For Ad Hoc Workloads” and “SQLSkills”.  I found a wonderful article from Kimberly Tripp on just this topic.  Here is the link.

     

     http://www.sqlskills.com/blogs/kimberly/post/procedure-cache-and-optimizing-for-adhoc-workloads.aspx

     

    The article suggests running the below query to determine the number of plans in cache and the total space that they are taking up.  So I ran the query on my memory hungry server and the following is what happened......

     

    SELECT objtype AS [CacheType]

            , count_big(*) AS [Total Plans]

            , sum(cast(size_in_bytes as decimal(18,2)))/1024/1024 AS [Total MBs]

            , avg(usecounts) AS [Avg Use Count]

            , sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(18,2)))/1024/1024 AS [Total MBs - USE Count 1]

            , sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]

    FROM sys.dm_exec_cached_plans

    GROUP BY objtype

    ORDER BY [Total MBs - USE Count 1] DESC

    go

     

     

     

    Initial Query Results:  This is what I started with.

     

    CacheType   Total Plans   Total MBs     Avg Use Count Total MBs - USE Count 1  Total Plans 

    ----------- ------------- ------------- ------------- ------------------------ ------------

    Adhoc       32750         2352.641181       927           947.289619                 9167

    Proc        842           387.390625        169428        6.882812                   29

    Prepared    576           69.460937         15176         6.234375                   64

    Trigger     35            21.867187         6154          0.828125                   3

    Check       31            0.812500          11453         0.023437                   1

    View        327           36.875000         8057          0.000000                   0

    UsrTab      4             0.468750          1473          0.000000                   0

     

    Then I turned on “Optimized for Ad Hoc Workload” and watched the total number of plans decrease along with the total amount of space depleat.  I kept monitoring during this time as well using SQL Monitor and the only thing that I noticed was the Buffer Free Pages dropped from 1.7 million to .7 million during this 4 hours I spent watching this server.

     

    4 hours had passed, Query Results: 

     

    CacheType   Total Plans  Total MBs    Avg Use Count Total MBs - USE Count 1   Total Plans 

     ----------  -----------  ------------ ------------- ------------------------- ------------

    Adhoc       42270        2264.423034        733           659.141784                11827

    Proc        833          320.968750         173396        6.882812                  29

    Prepared    653          84.187500          13557         2.773437                  26

    Trigger     35           21.453125          6624          0.609375                  2

    Check       31           0.812500           11582         0.023437                  1

    View        327          36.875000          8159          0.000000                  0

    UsrTab      4            0.468750           1490          0.000000                  0

     

    Then I decided instead of waiting for the server to slowly correct itself I would go ahead and issue DBCC FREEPROCCACHE to clear the procedure cache.

     

    After DBCC command had run, Query Results:

     

    CacheType  Total Plans   Total MBs    Avg Use Count Total MBs - USE Count 1    Total Plans

    ---------- ------------- ------------ ------------- -------------------------- ------------

    Proc       70            21.031250          20            5.804687                   17

    Adhoc      215           5.745986           3             0.691299                   128

    Prepared   21            1.625000           5             0.523437                   9

    Trigger    3             1.140625           6             0.382812                   1

    View       28            1.656250           8             0.000000                   0

     

    Buffer Free Pages climbing from .7 million to 1.1 million. I thought I would see Buffer Free Pages go through the roof, but I’m guessing that data cache stepped in and took over what had become available.

     

    What I expect to see in the next 12 hours is that the total plans and total MB’s will grow again, but not to the size that it was in the first query.  I’m going to bed now and I’ll check the server in the morning……

     

    And...I’m back...

     

    Results 12 hours after cache was cleared:

     

    CacheType  Total Plans   Total MBs    Avg Use Count Total MBs - USE Count 1       Total Plans

    ---------- ------------- ------------ ------------- ----------------------------- ------------

    Adhoc      61025         1456.307067        8             523.744567                    46369

    Proc       348           138.406250         4961          8.828125                      40

    Prepared   615           76.601562          279           3.718750                      46

    Check      32            0.781250           279           0.218750                      11

    Trigger    16            6.398437           1247          0.000000                      0

    View       322           30.742187          299           0.000000                      0

    UsrTab     3             0.250000           48            0.000000                      0

     

    Conclusion:  The total number of Adhoc plans in cache were higher than the original baseline, however, the space being used for Adhoc plans was significantly less with the “Optimize For Ad Hoc Workloads” configuration option set on.  Because this server houses databases that are accessed with an unusual amount of Adhoc queries I will leave this option on.

     

    About the Author

    User bio imageI'm a proud mother, dog owner and SQL Architect. I love to teach and am just beginning to get back into bike riding. I work for Swank Motion Pictures and I teach for Washington University CAIT in St. Louis, Missouri
    Social SitingsTwitterFacebookLinkedInWindows Live SpacesLTD RSS Feed
    Instapaper

    No feedback yet

    Leave a comment


    Your email address will not be revealed on this site.

    Your URL will be displayed.
    (Line breaks become <br />)
    (Name, email & website)
    (Allow users to contact you through a message form (your email will not be revealed.)