You might know that Resource
Governor (RG) can be used to allow you to affect resource allocation inside SQL
Server. RG was introduced with SQL Server 2008 and requires Enterprise Edition
or similar/higher. There are two things you can govern using RG: cpu and
memory.
For introductory information on RG, see for instance these BOL topics.
A misconception I see from time to time is that the memory setting
is to restrict the Buffer Pool, BP, (mainly used for caching pages from
disk). This seems difficult since a page in BP has a cost, but isn't owned by
whoever brought it into cache or who referenced it last time. So, it seems
difficult with current implementation of cache handling and ageing to govern
the BP memory for RG. What RG does govern is "working memory"
for a query. Think memory used for sorting, locks, hashing and such.
We just had such a discussion in the MSDN forums, and I decided to
do a test to see if we could show that RG do not govern the BP. Brief outline
of the script
- Restrict the BP to 300 MB
- Create two databases (a and b)
- Create a table with size
of 255MB in each database
- Create two logins with name a
and b, which will be used to execute queries
- The logins end up with two
different resource pools (aPool and bPool), where aPool has max mem 80%
and bPool has max mem 20%
- A loop which generates queries
that are executed using xp_cmdshell and SQLCMD
- The loop first scan over the
first approx 9% of data, first login a in database a, then in login b
in database b
- Next iteration is then done
over the following 9 % of data
- After 11 iteration, we've done
most data
- Finally check how much memory
in the BP each database is using
If RG were to govern the BP, we expect to see database a using
lots of more pages than database b. That not what we are seeing. You will
probably see that database b is using slightly more memory than a. That is
because you done exactly the same queries over exactly the same data for each
database and the most recent database you queried was database b (pushing out
some of the pages with same cost that database a had in cache). You might want
to execute the loop a few times to possibly see things even out a bit.
Seeing is believing, they say, and to me this show that Resource
Governor do not govern the Buffer Pool.
If you believe there are faults in how the script does things,
feel free to discuss. If you have some alternative script you want us to try, I
suggest you open a thread in the MSDN forum (for example) and there post a
script which is pretty immediately executable for us(possibly with
modifications of file path and server name). Unless the changes you propose are
so minor that can be immediately explained in your text.
/nice thing...
ReplyDeletevery helpful.