{"id":3651,"date":"2014-03-20T08:15:00","date_gmt":"2014-03-20T07:15:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/"},"modified":"2014-03-20T08:15:00","modified_gmt":"2014-03-20T07:15:00","slug":"sql-server-2014-buffer-pool-extension","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/","title":{"rendered":"SQL Server 2014: Buffer pool extension &#8211; an interesting new feature"},"content":{"rendered":"<p><img decoding=\"async\" class=\"blog-image aligncenter\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\" alt=\"\" \/><\/p>\n<p>Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand. Nowadays, even if the memory has become cheaper, we are often facing limitations such as mid-size hardware configurations and increasing memory. All this can become difficult and may require a hardware upgrade that can be expensive. In the same time, increasing the disk capacity is no longer a challenge and can be handled more flexibly. Furthermore, solid-state drive technology has become relatively affordable over time. In short, adding disks to a server potentially becomes more cost-effective than adding memory for the mid-size hardware configurations. BPE was designed to address this issue by using the non-volatile memory to extend the buffer pool.<\/p>\n<p>As mentioned by Microsoft the buffer pool extension provides benefits for specific cases:<\/p>\n<ul>\n<li>Increased random I\/O throughput. Indeed, flash-based storage performs well with random IO but sequential IO can be less efficient than using a disk-based storage<\/li>\n<li>Reduced I\/O latency by using a smart L1 and L2 caches with the buffer manager. Pages are moved between the L2 cache (SSD) and L1 cache (memory) by the buffer manager before it has to fetch the page from the disk with generally more latency.<\/li>\n<li>Only clean pages are written to the BPE. This ensures no data loss.<\/li>\n<\/ul>\n<p>When I investigated this feature in more detail, I had the opportunity to read the official documentation and blog posts already published by Microsoft and the very interesting article <a href=\"http:\/\/gsl.azurewebsites.net\/Portals\/0\/Users\/Projects\/SSD\/sigmod2010.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">Turbocharging DBMS Buffer Pool Using SSDs<\/a> written by Do, J., Zhang, D., Patel, J., DeWitt, D., Naughton, J., and A. Halverson. I also listened to one of the interview of Evgeny Krivosheev (SQL Server Program Manager) about the buffer pool extension feature. I would like to precise that there are still blog posts on the web which claim some workloads work better with the buffer pool extension feature. Of course, the quick answer is yes for the reasons described above and this is not my goal here. This post is just an opportunity to share with you some of my investigations &#8211; but before, I have to warn you: We are still talking about CTP2 of SQL Server 2014 and some of the tools I used do not work perfectly. We will see this later in the post.<\/p>\n<p>The first thing I noticed is the decision made to store data in SSD at the granularity level of pages rather than tables or files. This point is important because we can retrieve different pages of a table either in the memory, or in the SSD, or in the disk. As mentioned above, only clean pages are written to the buffer pool extension. There is still an exception that consists of writing a modified page (dirty) both into the database mdf file and into the BPE. This is a kind of optimization called dual-write optimization.<\/p>\n<p>Let\u2019s start with my first test in which I used a custom AdventureWorks2012 database with two bigTransactionHistory tables. Here some details about the size and number of rows of each of those tables:<\/p>\n<p>The bigTransactionHistory table contains 31 billion of rows for a size of 2 GB approximately (data and indexes).<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">USE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">AdventureWorks2012<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">EXEC<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: maroon\">sp_spaceused<span style=\"color: red\">&#8216;dbo.bigTransactionHistory&#8217;<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_1_adventureworks_bigtransactionhistory_size.jpg\" alt=\"billet4_1_adventureworks_bigtransactionhistory_size\" width=\"492\" height=\"38\" \/><\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">EXEC<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: maroon\">sp_spaceused<span style=\"color: red\">&#8216;dbo.bigTransactionHistory_2&#8217;<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_2_adventureworks_bigtransactionhistory_2_size.jpg\" alt=\"billet4_2_adventureworks_bigtransactionhistory_2_size\" width=\"494\" height=\"39\" \/><\/p>\n<p>In my test, the AdventureWorks2012 database is configured as follows:<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">USE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">AdventureWorks2012<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">name<span style=\"color: gray\">,<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">physical_name<\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">database_files<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_3_adventureworks_db_configuration.jpg\" alt=\"billet4_3_adventureworks_db_configuration\" width=\"557\" height=\"62\" \/><\/p>\n<p>The mdf and ldf files are stored both on a slow drive (E:) which is a WDC USB disk (5200 RPM) with SATA\/300. This is not an optimal configuration but for this test it&#8217;s ok.<br \/>\nThe buffer pool maximum size on my SQL Server instance is voluntarily fixed to 700 MB.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">name<span style=\"color: gray\">,<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">value_in_use<\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">configurations<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WHERE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">name <span style=\"color: gray\">= <span style=\"color: red\">&#8216;max server memory (MB)&#8217;<\/span><\/span><\/span><\/span><\/span><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_5_bpe_configuration.jpg\" alt=\"billet4_5_bpe_configuration\" width=\"500\" height=\"35\" \/><\/p>\n<p>Finally, I set up the maximum size of the buffer pool extension to 2 GB:<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ALTER<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">SERVER <span style=\"color: teal\">CONFIGURATION <span style=\"color: blue\">SET <span style=\"color: teal\">BUFFER <span style=\"color: blue\">POOL <span style=\"color: teal\">EXTENSION<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ON<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">(<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">FILENAME <span style=\"color: gray\">= <span style=\"color: red\">N&#8217;C:Program FilesMicrosoft SQL ServerMSSQL12.MSSQLSERVERMSSQLDATAssdbuffer_pool.bpe&#8217;<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">SIZE <span style=\"color: gray\">= 2048 <span style=\"color: teal\">MB<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">);<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">[path]<span style=\"color: gray\">,<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">state_description<span style=\"color: gray\">,<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">current_size_in_kb <span style=\"color: gray\">\/ 1024 <span style=\"color: blue\">AS <span style=\"color: teal\">current_size_mb<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: teal\">dm_os_buffer_pool_extension_configuration<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_5_bpe_configuration.jpg\" alt=\"billet4_5_bpe_configuration\" width=\"600\" height=\"42\" \/><\/p>\n<p>The buffer pool extension file is stored on fast solid-state drive (C:) which is a Samsung SSD 840 EVO with a SATA\/600<\/p>\n<p>At this point, we can start the first test by loading the entire table bigTransationHistory_2 in the buffer pool with a cold cache. Actually, data pages are stored only on the volatile memory as expected after clearing the buffer cache.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: green\">&#8212; Clean buffer pool + BPE<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">DBCC<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">DROPCLEANBUFFERS<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: green\">&#8212; Check pages in BP for the AdventureWorks2012 database<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">CASE <span style=\"color: teal\">is_in_bpool_extension<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">WHEN 1 <span style=\"color: blue\">THEN <span style=\"color: red\">&#8216;SSD&#8217;<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">ELSE <span style=\"color: red\">&#8216;RAM&#8217;<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">END <span style=\"color: blue\">AS <span style=\"color: teal\">location<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: fuchsia\">COUNT<span style=\"color: gray\">(*) <span style=\"color: blue\">AS <span style=\"color: teal\">nb_pages<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: fuchsia\">COUNT<span style=\"color: gray\">(*) <span style=\"color: gray\">* 8 <span style=\"color: gray\">\/ 1024 <span style=\"color: blue\">AS <span style=\"color: teal\">size_in_mb<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: fuchsia\">COUNT<span style=\"color: gray\">(*) <span style=\"color: gray\">* 100. <span style=\"color: gray\">\/<span style=\"color: gray\">(<span style=\"color: blue\">SELECT <span style=\"color: fuchsia\">COUNT<span style=\"color: gray\">(*) <span style=\"color: blue\">FROM <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">dm_os_buffer_descriptors<span style=\"color: gray\">) <span style=\"color: blue\">AS <span style=\"color: teal\">percent_<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">dm_os_buffer_descriptors<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WHERE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">database_id <span style=\"color: gray\">= <span style=\"color: fuchsia\">DB_ID<span style=\"color: gray\">(<span style=\"color: red\">&#8216;AdventureWorks2012&#8217;<span style=\"color: gray\">)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GROUP<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">BY <span style=\"color: teal\">is_in_bpool_extension<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_6_bpe_configuration.jpg\" alt=\"billet4_6_bpe_configuration\" width=\"324\" height=\"65\" \/><\/p>\n<p>In the same time before the loading, I created an extended event session in order to track the page movement between the non-volatile memory (SSD) and the volatile memory (RAM) for the dynamic pool cache. During my test, I found out that some events are not tracked correctly (for example sqlserver.buffer_pool_extension_pages_read), probably because we are still in CTP2 of SQL Server 2014 \u2026<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">CREATE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: blue\">SESSION <span style=\"color: teal\">[buffer_pool_extension]<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ON<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">SERVER<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ADD<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: teal\">sqlserver<span style=\"color: gray\">.<span style=\"color: teal\">buffer_pool_eviction_thresholds_recalculated<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ADD<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: teal\">sqlserver<span style=\"color: gray\">.<span style=\"color: teal\">buffer_pool_extension_pages_evicted<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ADD<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: teal\">sqlserver<span style=\"color: gray\">.<span style=\"color: teal\">buffer_pool_extension_pages_read<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ADD<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: teal\">sqlserver<span style=\"color: gray\">.<span style=\"color: teal\">buffer_pool_extension_pages_written<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ADD<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">TARGET <span style=\"color: teal\">package0<span style=\"color: gray\">.<span style=\"color: teal\">ring_buffer<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WITH<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">(<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">MAX_MEMORY <span style=\"color: gray\">= 4096 <span style=\"color: teal\">KB<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">EVENT_RETENTION_MODE <span style=\"color: gray\">= <span style=\"color: teal\">ALLOW_SINGLE_EVENT_LOSS<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">MAX_DISPATCH_LATENCY <span style=\"color: gray\">= 30 <span style=\"color: teal\">SECONDS<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">);<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ALTER<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">EVENT <span style=\"color: blue\">SESSION <span style=\"color: teal\">[buffer_pool_extension]<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">ON<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">SERVER <\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">STATE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: gray\">= <span style=\"color: teal\">START<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<p>After loading the bigTransactionHistory_2, there are data pages that exist both in the memory and buffer pool extension. The bigTransactionHistory_2 table doesn\u2019t fit entirely in the allocated non-volatile memory. This is why we retrieve some pages (64% of the total pages) in the buffer pool extension. However, we notice that SQL Server didn&#8217;t allocate all the nonvolatile memory for the bigTransactionHistory_2 table before filling up in turn the buffer pool extension. The algorithm is smart enough to leave spaces in the non-volatile memory for future requests. Although the solid-state drive remains fast, non-volatile memory is faster (nanoseconds vs microseconds).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_7_pages_in_bpe.jpg\" alt=\"billet4_7_pages_in_bpe\" width=\"312\" height=\"62\" \/><\/p>\n<p>Then, if we take a look at the pages in the buffer pool extension in more details with the same dynamic management view sys.dm_os_buffer_descriptors, we retrieve some page information like page id and file id &#8211; but nothing more, maybe because we are still in the CTP version \u2026<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: gray\">*<\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">dm_os_buffer_descriptors<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WHERE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">is_in_bpool_extension <span style=\"color: gray\">= 1<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_8_pages_in_bpe_2.jpg\" alt=\"billet4_8_pages_in_bpe_2\" width=\"618\" height=\"135\" \/><\/p>\n<p>Don\u2019t panic! We have others ways to find out what pages belong to the bigTransactionHistory_2 in the buffer pool extension. For example, we can correlate information from the new dynamic management function sys.dm_db_database_page_allocation() that replaces the undocumented but useful command DBCC IND since SQL Server 2012 with the information provided by the dynamic management view sys.dm_os_buffer_descriptors. First, I get the pages allocated to the bigTransactionHistory_2 into a tempdb table. Then we have to clear the buffer pool to avoid loading data pages into the buffer cache and evict others pages that are concerned by our first test.<\/p>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SET<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">NOCOUNT<\/span> <span style=\"color: blue\">ON<\/span><span style=\"color: gray\">;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">allocated_page_page_id<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">INTO<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">#allocation_page_big_TransactionHistory_2<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">dm_db_database_page_allocation<\/span><span style=\"color: gray\">(<\/span><span style=\"color: fuchsia\">DB_ID<\/span><span style=\"color: gray\">(),<\/span><span style=\"color: fuchsia\">OBJECT_ID<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;dbo.bigTransactionHistory_2&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: gray\">NULL,<\/span> <span style=\"color: gray\">NULL,<\/span> <span style=\"color: red\">&#8216;DETAILED&#8217;<\/span><span style=\"color: gray\">)<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WHERE<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">is_allocated<\/span> <span style=\"color: gray\">=<\/span> 1<span style=\"color: gray\">;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">DBCC<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">DROPCLEANBUFFERS<\/span><span style=\"color: gray\">;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: gray\">*<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">AdventureWorks2012<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">dbo<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">bigTransactionHistory_2<\/span><span style=\"color: gray\">;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">CASE<\/span> <span style=\"color: teal\">is_in_bpool_extension<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">WHEN<\/span> 1 <span style=\"color: blue\">THEN<\/span> <span style=\"color: red\">&#8216;SSD&#8217;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">ELSE<\/span> <span style=\"color: red\">&#8216;RAM&#8217;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">END<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">location<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: fuchsia\">COUNT<\/span><span style=\"color: gray\">(*)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">nb_pages<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: fuchsia\">COUNT<\/span><span style=\"color: gray\">(*)<\/span> <span style=\"color: gray\">*<\/span> 8 <span style=\"color: gray\">\/<\/span> 1024 <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">size_in_mb<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">#allocation_page_big_TransactionHistory_2<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">tmp<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: gray\">JOIN<\/span> <span style=\"color: green\">sys<\/span><span style=\"color: gray\">.<\/span><span style=\"color: green\">dm_os_buffer_descriptors<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">bd<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">ON<\/span> <span style=\"color: teal\">tmp<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">allocated_page_page_id<\/span> <span style=\"color: gray\">=<\/span> <span style=\"color: teal\">bd<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">page_id<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GROUP<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">BY<\/span> <span style=\"color: teal\">is_in_bpool_extension<\/span><span style=\"color: gray\">;<\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_9_pages_in_bpe_3.jpg\" alt=\"billet4_9_pages_in_bpe_3\" width=\"313\" height=\"178\" \/><\/p>\n<p>So, we can verify that the majority of data pages in the buffer pool and the buffer pool extension are concerned by the bigTransactionHistory_2. Now let\u2019s take a look at the extended events session ring buffer target:<\/p>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WITH<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">xe_session_bpe<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">AS<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">(<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">SELECT<\/span> <\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: fuchsia\">CAST<\/span><span style=\"color: gray\">(<\/span><span style=\"color: teal\">target_data<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: blue\">XML<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">target_data_xml<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">FROM<\/span> <span style=\"color: green\">sys<\/span><span style=\"color: gray\">.<\/span><span style=\"color: green\">dm_xe_sessions<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">s<\/span><span>\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: gray\">JOIN<\/span> <span style=\"color: green\">sys<\/span><span style=\"color: gray\">.<\/span><span style=\"color: green\">dm_xe_session_targets<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">st<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">ON<\/span> <span style=\"color: teal\">s<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">[address]<\/span> <span style=\"color: gray\">=<\/span> <span style=\"color: teal\">st<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">event_session_address<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: blue\">WHERE<\/span> <span style=\"color: teal\">s<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">name<\/span> <span style=\"color: gray\">=<\/span> <span style=\"color: red\">&#8216;buffer_pool_extension&#8217;<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">)<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: teal\">N<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">value<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;(.\/@timestamp)[1]&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: red\">&#8216;datetime&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">event_date<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: teal\">N<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">value<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;(.\/@name)[1]&#8217;<\/span><span style=\"color: gray\">,<\/span><span style=\"color: red\">&#8216;varchar(100)&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">event_type<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: teal\">N<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">value<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;(.\/data\/value)[1]&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: red\">&#8216;int&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">nb_pages<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: teal\">N<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">value<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;(.\/data\/value)[2]&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: red\">&#8216;bigint&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">first_page_file_id<\/span><span style=\"color: gray\">,<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: teal\">N<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">value<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;(.\/data\/value)[3]&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: red\">&#8216;bigint&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">first_page_id<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">x_session_bpe<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">bpe<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">CROSS<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: gray\">APPLY<\/span> <span style=\"color: teal\">bpe<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">target_data_xml<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">nodes<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;\/RingBufferTarget\/event&#8217;<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">N<\/span><span style=\"color: gray\">(<\/span><span style=\"color: teal\">X<\/span><span style=\"color: gray\">);<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">GO<\/span><\/div>\n<p>We can observe that during the load of the bigTransactionHistory_2 table, different data pages have been written into the buffer pool extension (event type = buffer_pool_exentesion_pages_written). Sometimes we have only one page or we have a bunch of pages written in one time.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_10_xe.jpg\" alt=\"billet4_10_xe\" width=\"608\" height=\"231\" \/><\/p>\n<p>We can also check if the page with the id equal to 394453 in the first file of the database AdventureWorks2012 (file id = 1) belongs to the bigTransactionHistory_2 table :<\/p>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">SELECT<\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span style=\"color: fuchsia\">OBJECT_NAME<\/span><span style=\"color: gray\">(<\/span><span style=\"color: fuchsia\">object_id<\/span><span style=\"color: gray\">)<\/span> <span style=\"color: blue\">AS<\/span> <span style=\"color: teal\">table_name<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">FROM<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<\/span><span style=\"color: gray\">.<\/span><span style=\"color: teal\">dm_db_database_page_allocation<\/span><span style=\"color: gray\">(<\/span><span style=\"color: fuchsia\">DB_ID<\/span><span style=\"color: gray\">(),<\/span><span style=\"color: fuchsia\">OBJECT_ID<\/span><span style=\"color: gray\">(<\/span><span style=\"color: red\">&#8216;dbo.bigTransactionHistory_2&#8217;<\/span><span style=\"color: gray\">,<\/span> <span style=\"color: gray\">NULL,<\/span> <span style=\"color: gray\">NULL,<\/span> <span style=\"color: red\">&#8216;LIMITED&#8217;<\/span><span style=\"color: gray\">)<\/span><\/span><\/div>\n<div class=\"MsoNormal\" style=\"margin-bottom: .0001pt;line-height: normal;background: #D9D9D9\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WHERE<\/span><span lang=\"EN-US\" style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">allocated_page_file_id<\/span> <span style=\"color: gray\">=<\/span> 1<\/span><\/div>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-size: 9.5pt;line-height: 107%;font-family: Consolas\"><span>\u00a0<\/span><\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_11_bpe_page_id_check.jpg\" alt=\"billet4_11_bpe_page_id_check\" width=\"170\" height=\"43\" \/><\/p>\n<p>After this first test we can push our thinking a little bit further by trying to find out if a second loading of the same table can trigger the reading of data pages from the buffer pool extension. I used the following useful perfmon counters:<\/p>\n<ul>\n<li>SQL Server:Buffer Manager:Extension page reads\/sec<\/li>\n<li>SQL Server:Buffer Manager:Extension page writes\/sec<\/li>\n<li>SQL Server:Buffer Manager:Page reads\/sec<\/li>\n<li>SQL Server:Buffer Manager:Page writes\/sec<\/li>\n<li>SQL Server:Readahead pages\/sec<\/li>\n<\/ul>\n<p>-&gt; Reading the bigTransactionHistory_2 table with a cold cache:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_12_bpe_perfmon_1.jpg\" alt=\"billet4_12_bpe_perfmon_1\" width=\"605\" height=\"261\" \/><\/p>\n<p><strong>Phase 1<\/strong>: After starting the loading of our table in the buffer pool, we observe that SQL Server fetches a data page from the disk in the buffer cache. SQL Server also uses read-ahead mechanisms by using the index allocation map page of the bigTransactionHistory_2. This is why we notice a constant value of the buffer cache hit ratio (98%) during all the loading table time. At the end of the phase 1, the page life time expectancy counter comes down quickly because the buffer pool (in non-volatile memory) is full.<\/p>\n<p><strong>Phase 2<\/strong>: During this phase, the buffer pool cache extension takes over. Data pages are written into the file on the solid-state disk (Extension page writes \/ sec).<\/p>\n<p>-&gt; <span lang=\"EN-US\">Reading the bigTransactionHistory_2 with a warm cache:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_12_bpe_perfmon_2.jpg\" alt=\"billet4_12_bpe_perfmon_2\" width=\"600\" height=\"275\" \/><\/p>\n<p>The buffer pool extension is used as expected when we read the bigTransactionHistory_2 table a second time. Data pages are already both in the buffer pool in the non-volatile memory and in the buffer pool extension in the solid-state drive. Furthermore, we have a few reads from the mdf file rather than the first reading of the bigTransactionhistory_2 with a cold cache. However, even if the buffer pool extension is used correctly, I notice that reading the bigTransactionHistory_2 table from a warm cache is longer than reading the same table from a cold cache (respectively 39 seconds versus 1 minute and 4 seconds). It\u2019s a very strange result from my point of view even if we are using sequential IO in the both cases (scanning the bigTransactionHistory_2 table triggers read-ahead mechanism which uses itself sequential IO by design).<\/p>\n<p>I decided to launch the same tests and to take a look at the resource monitor and disk usage from the sqlservr.exe. Here are the results:<\/p>\n<p>-&gt;With a cold cache (disk E: is used by SQL Server) :<br \/>\n<span lang=\"EN-US\">The IO write throughput of the disk E is approximately 10 MB\/s <\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_13_reosurce_monitor_1.jpg\" alt=\"billet4_13_reosurce_monitor_1\" width=\"615\" height=\"270\" \/><\/span><\/p>\n<p>-&gt;With a warm cache (disk C: is used by SQL Server) : The IO write throughput of the disk C: is approximately 7MB\/s<\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-size: 11.0pt;line-height: 107%;font-family: 'Calibri','sans-serif'\">\u00a0<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-size: 11.0pt;line-height: 107%;font-family: 'Calibri','sans-serif'\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_13_reosurce_monitor_2.jpg\" alt=\"billet4_13_reosurce_monitor_2\" width=\"620\" height=\"274\" \/><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-size: 11.0pt;line-height: 107%;font-family: 'Calibri','sans-serif'\">\u00a0<\/span><\/p>\n<p>The IO write throughput of the disk C: is approximately 7MB\/s. First, according to what we have seen, we can conclude that the duration of the second test with a warm cache is caused by the lower throughput of the solid-state drive C:. However, this throughput is relatively strange and I decided to verify if it\u2019s really the maximum throughput we I can have with my solid state drive disk by using CrystalDiskMark.<\/p>\n<p>-&gt; Disk E: (disk-based storage) : 33 MB \/ s<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_crystaldiskmark_mssql_data.jpg\" alt=\"billet4_crystaldiskmark_mssql_data\" width=\"414\" height=\"326\" \/><\/p>\n<p>-&gt; Disk C: (flash-based storage) : 308 MB \/ s<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_crystaldiskmark_bpe_data.jpg\" alt=\"billet4_crystaldiskmark_bpe_data\" width=\"414\" height=\"329\" \/><\/p>\n<p>You can see that we are far from reaching the maximum throughput of the solid-state drive. A mystery to be solved with Microsoft \u2026 Finally, I decided to launch a last test by using both tables bigTransactionHistory and the bigTransactionHistory_2 this time. The total size of the two tables is bigger than the total size of the buffer pool and its extension (3 GB versus 2.7 GB approximately).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_14_perfmon.jpg\" alt=\"billet4_14_perfmon\" width=\"615\" height=\"221\" \/><\/p>\n<p>The buffer pool extension is also used as a warm cache (extension page reads \/ sec) in this case. However, the data pages are also written to the buffer pool extension (extension page written \/ sec) at the same time, because all data pages cannot be stored entirely in the buffer pool and the buffer pool extension. We can see that the data pages continue to be read from the mdf file during the test (readahead pages \/ sec and read pages \/ sec). According to the paper <a href=\"http:\/\/gsl.azurewebsites.net\/Portals\/0\/Users\/Projects\/SSD\/sigmod2010.pdf\" target=\"_self\" rel=\"noopener noreferrer\">Turbocharging DBMS Buffer Pool Using SSDs<\/a>, I guess SQL Server uses the LRU-2 algorithm to evict pages during the reading of both tables. If we take a closer look at the result of the extended event target, we can see a new event triggered during the test: buffer_pool_eviction_thresholds_recalculated.<\/p>\n<p><span style=\"color: windowtext;text-decoration: none\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet4_15_xevent_eviction_threshold.jpg\" alt=\"billet4_15_xevent_eviction_threshold\" width=\"582\" height=\"57\" \/><\/span><\/p>\n<p>When the buffer pool extension begins to fill itself up, SQL Server decides which pages will be evicted by dynamically calculating two thresholds. Those thresholds determine the movement of the data pages between the buffer pool (non-volatile memory), the buffer pool extension (solid-state drive) and the database data file (disk-based storage). As you can imagine, the location of a data page depends on its \u201ctemperature\u201d. During my test, I noticed that the buffer_pool_eviction_thresholds_recalculated event does not provide all sets of action values like number_evictions_to_bpool_extension or page_not_on_LRU that could be very useful for troubleshooting or to understand how eviction occurs. Again, I guess maybe this is due to the CTP2 of SQL Server \u2026 Please feel free to share your experience about testing buffer pool extension!<\/p>\n<p><span style=\"float: none;background-color: #ffffff;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;text-align: left;text-decoration: none;text-indent: 0px;text-transform: none\">By David Barbarin<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand. Nowadays, even if the [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":3590,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[198],"tags":[440,49,52,441],"type_dbi":[],"class_list":["post-3651","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-management","tag-buffer-pool-extension","tag-microsoft","tag-sql-server-2014","tag-ssd"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL Server 2014: Buffer pool extension - an interesting new feature - dbi Blog<\/title>\n<meta name=\"description\" content=\"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server 2014: Buffer pool extension - an interesting new feature\" \/>\n<meta property=\"og:description\" content=\"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-03-20T07:15:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"245\" \/>\n\t<meta property=\"og:image:height\" content=\"149\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"SQL Server 2014: Buffer pool extension &#8211; an interesting new feature\",\"datePublished\":\"2014-03-20T07:15:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\"},\"wordCount\":2469,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\",\"keywords\":[\"buffer pool extension\",\"Microsoft\",\"SQL Server 2014\",\"ssd\"],\"articleSection\":[\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\",\"name\":\"SQL Server 2014: Buffer pool extension - an interesting new feature - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\",\"datePublished\":\"2014-03-20T07:15:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"description\":\"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg\",\"width\":245,\"height\":149},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server 2014: Buffer pool extension &#8211; an interesting new feature\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Server 2014: Buffer pool extension - an interesting new feature - dbi Blog","description":"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server 2014: Buffer pool extension - an interesting new feature","og_description":"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.","og_url":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/","og_site_name":"dbi Blog","article_published_time":"2014-03-20T07:15:00+00:00","og_image":[{"width":245,"height":149,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"SQL Server 2014: Buffer pool extension &#8211; an interesting new feature","datePublished":"2014-03-20T07:15:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/"},"wordCount":2469,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg","keywords":["buffer pool extension","Microsoft","SQL Server 2014","ssd"],"articleSection":["Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/","url":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/","name":"SQL Server 2014: Buffer pool extension - an interesting new feature - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg","datePublished":"2014-03-20T07:15:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"description":"Buffer pool extension (aka BPE) is an interesting feature of SQL Server 2014. Database administrators already know that memory is one of the key assets available for SQL Server. This is especially true for buffer pool memory, which plays an important role in storing data page and reducing the I\/O demand.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/2e1ax_default_entry_sqlserver2014.jpg","width":245,"height":149},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-2014-buffer-pool-extension\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server 2014: Buffer pool extension &#8211; an interesting new feature"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/3651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=3651"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/3651\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/3590"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=3651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=3651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=3651"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=3651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}