<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Argenis Fernandez : x64, AWE</title><link>http://sqlblog.com/blogs/argenis_fernandez/archive/tags/x64/AWE/default.aspx</link><description>Tags: x64, AWE</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>The Myth Around 32-bit SQL Server Instances on 64-bit Operating Systems, and AWE</title><link>http://sqlblog.com/blogs/argenis_fernandez/archive/2012/12/30/the-myth-around-32-bit-sql-server-instances-on-64-bit-operating-systems-and-awe.aspx</link><pubDate>Sun, 30 Dec 2012 23:36:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:46892</guid><dc:creator>Argenis</dc:creator><slash:comments>4</slash:comments><comments>http://sqlblog.com/blogs/argenis_fernandez/comments/46892.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/argenis_fernandez/commentrss.aspx?PostID=46892</wfw:commentRss><description>&lt;p&gt;&lt;i&gt;(I’m taking a break from my DBA Best Practices blog series to talk about this today – the series continues after the Holidays!)&lt;/i&gt;&lt;/p&gt;
  
&lt;p&gt;I love to be proved wrong. Really, I do.&lt;/p&gt;
  
&lt;p&gt;Recently we had a discussion in an distribution list where somebody asked whether a SQL Server 32-bit instance could address more than 4Gb of RAM when running on top of a 64-bit OS. One of the really smart guys in Microsoft SQL Server Support, Karthick P.K.&amp;nbsp;[&lt;a href="http://mssqlwiki.com/"&gt;Blog&lt;/a&gt;|&lt;a href="http://blogs.msdn.com/b/karthick_pk/"&gt;Blog&lt;/a&gt;|&lt;a href="https://twitter.com/mssqlwiki"&gt;Twitter&lt;/a&gt;]&amp;nbsp;replied “sure, just add more RAM and enable AWE – SQL will use that memory”. I was much convinced that this was incorrect, so I jumped in and said that AWE does nothing under those circumstances. After all, that is what I had read in the past in many different &lt;a href="http://msdn.microsoft.com/en-us/library/ms187499(v=sql.105).aspx"&gt;articles&lt;/a&gt;. I even had some SQL Server MVPs who have been around the block forever agreeing with me.&lt;/p&gt;
  
&lt;p&gt;But the good news is that I was wrong.&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;AWE in fact does nothing on 64-bit instances of SQL Server. But on WOW64 - Windows on Windows 64-bit, the subsystem of Windows x64 that allows you to run 32-bit processes and instances of SQL Server, AWE does allow you to address memory above 4Gb&lt;/b&gt;. Let me show you.&lt;/p&gt;
  
&lt;p&gt;Side note: AWE is now deprecated - removed in SQL Server 2012. The last version of SQL Server that supports AWE is SQL Server 2008 R2. Because of this, a SQL Server 2012 x86 instance won’t be able to enjoy over 4Gb of memory – even if running on WOW64.&lt;/p&gt;
  
&lt;p&gt;I setup a vanilla VM in my lab with a 64-bit OS with 8Gb of memory. MSINFO32 looks like this on the VM:&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_285792A7.png"&gt;&lt;img style="border-width:0px;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_29521335.png" width="1028" height="772"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;I installed a 32-bit SQL Server 2008 R2 SP2 instance on the VM. @@VERSION looked like this:&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_720B8BF9.png"&gt;&lt;img style="border-width:0px;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_7DA3D9E9.png" width="1128" height="132"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;I did not enable AWE&lt;/b&gt;. I did grant the “Perform Volume Maintenance Tasks” and “Lock Pages in Memory” privileges using secpol.msc (not pictured!). I wanted to see what memory consumption would look like without AWE enabled.&lt;/p&gt;
  
&lt;p&gt;This screenshot shows the permissions granted to the SQL Server Service Account (NETWORK SERVICE, in this case) – used “whoami /priv”, a quick and dirty way to get the privileges of the service account using xp_cmdshell. Ugh, xp_cmdshell. It’s okay, it’s just a test.&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_34148BEC.png"&gt;&lt;img style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_612978BA.png" width="720" height="586"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;I went ahead and created a test database with just one big table – big enough to use all the buffer pool memory on the instance when a size-of-data operation is executed on it. I did set Max Server Memory to 6Gb.&lt;/p&gt;
  
&lt;p&gt;Here’s the CREATE table script:&lt;/p&gt;
  
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[testTable](
    [id] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
    [wideColumn] [nvarchar](4000) &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
        &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; 
        (
            [id] &lt;span class="kwrd"&gt;ASC&lt;/span&gt;
        )&lt;span class="kwrd"&gt;WITH&lt;/span&gt; (PAD_INDEX  = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, STATISTICS_NORECOMPUTE  = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, IGNORE_DUP_KEY = &lt;span class="kwrd"&gt;OFF&lt;/span&gt;, ALLOW_ROW_LOCKS  = &lt;span class="kwrd"&gt;ON&lt;/span&gt;, ALLOW_PAGE_LOCKS  = &lt;span class="kwrd"&gt;ON&lt;/span&gt;) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]
) &lt;span class="kwrd"&gt;ON&lt;/span&gt; [&lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt;]
&lt;span class="kwrd"&gt;GO&lt;/span&gt;
&lt;span class="kwrd"&gt;ALTER&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[testTable] &lt;span class="kwrd"&gt;ADD&lt;/span&gt; &lt;span class="kwrd"&gt;DEFAULT&lt;/span&gt; (replicate(N&lt;span class="str"&gt;'A'&lt;/span&gt;,(4000))) &lt;span class="kwrd"&gt;FOR&lt;/span&gt; [wideColumn]
GO&lt;/pre&gt;

&lt;p&gt;Next, I went ahead and inserted 1M rows on the table:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [dbo].[testTable] &lt;span class="kwrd"&gt;DEFAULT&lt;/span&gt; &lt;span class="kwrd"&gt;VALUES&lt;/span&gt;
&lt;span class="kwrd"&gt;GO&lt;/span&gt; 1000000&lt;/pre&gt;

&lt;p&gt;If you do the math very quickly, you will agree with me that this not so little table will be more than 6Gb in size. Let’s check anyway:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_0A3417B7.png"&gt;&lt;img style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_7E9E5A77.png" width="436" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cool! The table is large enough for the purpose of this test. But how does memory utilization look like after that 1M row insert?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_451B4A80.png"&gt;&lt;img style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_6772DFF9.png" width="776" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s less than 4Gb. Next I turned on AWE, and restarted the instance. Then I queried the ERRORLOG to confirm that AWE was enabled:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_0DD4C345.png"&gt;&lt;img style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_77157BBB.png" width="776" height="140"&gt;&lt;/a&gt;&lt;/p&gt;









&lt;p&gt;Okay, since I had just restarted the instance my buffer pool was gone – needed to force a size of data operation on the large table. Rebuilding the clustered index did just fine (I know, that’s probably overkill). Then I checked sys.dm_os_process_memory again:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sqlblog.com/blogs/argenis_fernandez/image_4B64B1BF.png"&gt;&lt;img style="border:0px currentColor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/argenis_fernandez/image_thumb_34A56A36.png" width="666" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there we go! A lot more than 4Gb being used now that AWE is in play. I had set Max Server Memory to 6Gb, as I detailed earlier.&lt;/p&gt;

&lt;p&gt;It looks like there’s quite a lot of incorrect documentation regarding this, so I wanted to clear out any confusion – and learn something new along the way. Don’t you love SQL Server? &lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://sqlblog.com/blogs/argenis_fernandez/wlEmoticon-smile_4FDDC337.png"&gt;&lt;/p&gt;

&lt;p&gt;Happy Holidays and Happy New Year!&lt;/p&gt;

&lt;p&gt;-Argenis&lt;/p&gt;&lt;p&gt;P.S.: If you are running IA64 (Itanium) - then this doesn't apply to you. AWE does not work at all on IA64.&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=46892" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/argenis_fernandez/archive/tags/AWE/default.aspx">AWE</category><category domain="http://sqlblog.com/blogs/argenis_fernandez/archive/tags/Memory+Management/default.aspx">Memory Management</category><category domain="http://sqlblog.com/blogs/argenis_fernandez/archive/tags/x64/default.aspx">x64</category><category domain="http://sqlblog.com/blogs/argenis_fernandez/archive/tags/x86/default.aspx">x86</category></item></channel></rss>