{"id":537,"date":"2010-12-27T22:38:00","date_gmt":"2010-12-27T22:38:00","guid":{"rendered":"\/blogs\/jonathan\/post\/An-XEvent-a-Day-(27-of-31)-The-Future-Tracking-Page-Splits-in-SQL-Server-Denali-CTP1.aspx"},"modified":"2017-04-13T13:05:42","modified_gmt":"2017-04-13T17:05:42","slug":"an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/","title":{"rendered":"An XEvent a Day (27 of 31) &#8211; The Future &#8211; Tracking Page Splits in SQL Server Denali CTP1"},"content":{"rendered":"<p>\nNearly two years ago Kalen Delaney blogged about <a href=\"http:\/\/sqlblog.com\/blogs\/kalen_delaney\/archive\/2008\/12\/20\/splitting-a-page-into-multiple-pages.aspx\" target=\"_blank\">Splitting a page into multiple pages<\/a>, showing how page splits occur inside of SQL Server.&nbsp; Following her blog post, Michael Zilberstein wrote a post, <a href=\"http:\/\/sqlblog.com\/blogs\/michael_zilberstein\/archive\/2009\/02\/05\/11734.aspx\" target=\"_blank\">Monitoring Page Splits with Extended Events<\/a>, that showed how to see the sqlserver.page_split Events using Extended Events.&nbsp; Eladio Rinc&oacute;n also blogged about <a href=\"http:\/\/blogs.msmvps.com\/eladio_rincon\/2008\/12\/07\/using-xevents-extended-events-in-sql-server-2008-to-detect-which-queries-are-causing-page-splits\/\" target=\"_blank\">Using XEvents (Extended Events) in SQL Server 2008 to detect which queries are causing Page Splits<\/a>, but not in relation to Kalen&rsquo;s blog post.&nbsp; Both of these blog posts demonstrate how to get the sqlserver.page_split Events, but as discussed in the comments section of Michael Zilberstein&rsquo;s blog post, the Event fires for all page splits and Adam Machanic and I talked after Eladio&rsquo;s blog post and opened a connect item to have the sqlserver.page_split Event extended in the product so that you know what kind of split is actually occurring.\n<\/p>\n<p>\n<a href=\"https:\/\/connect.microsoft.com\/SQLServer\/feedback\/details\/388482\/sql-server-extended-events-page-split-event-additions\" title=\"https:\/\/connect.microsoft.com\/SQLServer\/feedback\/details\/388482\/sql-server-extended-events-page-split-event-additions\">https:\/\/connect.microsoft.com\/SQLServer\/feedback\/details\/388482\/sql-server-extended-events-page-split-event-additions<\/a>\n<\/p>\n<p>\nThe CTP1 release of Denali has significant changes to the sqlserver.page_split Event, that makes it easier to find the splitting object as well the type of split that is occurring.&nbsp; Before we look at that, I am going to show the code required to get the object and index information from SQL Server 2008, which is based on Adam&rsquo;s comments to use sys.dm_os_buffer_descriptors.&nbsp; For the examples in this blog post I am going use Kalen&rsquo;s multipage split example from her blog post referenced above.\n<\/p>\n<blockquote>\n<pre style=\"font-size: 12px\">\r\n\t<font color=\"green\">-- Create the table \r\n\t<\/font><font color=\"blue\">USE <\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SET NOCOUNT ON\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">IF <\/font><font color=\"gray\">EXISTS (<\/font><font color=\"blue\">SELECT <\/font><font color=\"gray\">* <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.tables\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;split_page&#39;<\/font><font color=\"gray\">)\r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">DROP TABLE <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">CREATE TABLE <\/font><font color=\"black\">split_page \r\n\t<\/font><font color=\"gray\">(<\/font><font color=\"black\">id <\/font><font color=\"blue\">INT <\/font><font color=\"#434343\">IDENTITY<\/font><font color=\"gray\">(<\/font><font color=\"black\">0<\/font><font color=\"gray\">,<\/font><font color=\"black\">2<\/font><font color=\"gray\">) <\/font><font color=\"blue\">PRIMARY KEY<\/font><font color=\"gray\">,\r\n\t<\/font><font color=\"black\">id2 bigint <\/font><font color=\"blue\">DEFAULT <\/font><font color=\"black\">0<\/font><font color=\"gray\">,\r\n\t<\/font><font color=\"black\">data1 <\/font><font color=\"blue\">VARCHAR<\/font><font color=\"gray\">(<\/font><font color=\"black\">33<\/font><font color=\"gray\">) NULL, \r\n\t<\/font><font color=\"black\">data2 <\/font><font color=\"blue\">VARCHAR<\/font><font color=\"gray\">(<\/font><font color=\"black\">8000<\/font><font color=\"gray\">) NULL);\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"green\">-- fill page until no more rows fit\r\n\t<\/font><font color=\"blue\">INSERT INTO <\/font><font color=\"black\">split_page <\/font><font color=\"blue\">DEFAULT VALUES<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO 385\r\n\t<\/font><font color=\"green\">-- verify that there is only one data page \r\n\t<\/font><font color=\"blue\">DBCC <\/font><font color=\"black\">IND<\/font><font color=\"gray\">(<\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">, <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">, -<\/font><font color=\"black\">1<\/font><font color=\"gray\">);\r\n\t<\/font><font color=\"green\">-- Create MonitorPageSplits Extended Event Session \r\n\t<\/font><font color=\"blue\">IF <\/font><font color=\"gray\">(<\/font><font color=\"blue\">SELECT <\/font><font color=\"black\">1 <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.server_event_sessions <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;MonitorPageSplits&#39;<\/font><font color=\"gray\">) <\/font><font color=\"blue\">IS <\/font><font color=\"gray\">NOT NULL \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">DROP <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\tGO \r\n\t<\/font><font color=\"blue\">CREATE <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\t<\/font><font color=\"blue\">ADD <\/font><font color=\"black\">EVENT sqlserver.page_split \r\n\t<\/font><font color=\"gray\">( \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"black\">ACTION <\/font><font color=\"gray\">(<\/font><font color=\"black\">sqlserver.database_id<\/font><font color=\"gray\">, <\/font><font color=\"black\">sqlserver.sql_text<\/font><font color=\"gray\">)&nbsp;&nbsp; \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">sqlserver.database_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">2 \r\n\t<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"blue\">ADD <\/font><font color=\"black\">TARGET package0.ring_buffer \r\n\t<\/font><font color=\"blue\">WITH<\/font><font color=\"gray\">(<\/font><font color=\"black\">MAX_DISPATCH_LATENCY <\/font><font color=\"blue\">= <\/font><font color=\"black\">1 SECONDS<\/font><font color=\"gray\">)\r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"green\">-- Start the MonitorPageSplits Event Session \r\n\t<\/font><font color=\"blue\">ALTER <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER STATE <\/font><font color=\"blue\">= <\/font><font color=\"black\">start<\/font><font color=\"gray\">; \r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"green\">-- Now insert one more row, this time filling the VARCHARs to the maximum length. \r\n\t<\/font><font color=\"blue\">SET IDENTITY_INSERT <\/font><font color=\"black\">split_page&nbsp; <\/font><font color=\"blue\">ON<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">INSERT INTO <\/font><font color=\"black\">split_page <\/font><font color=\"gray\">(<\/font><font color=\"black\">id<\/font><font color=\"gray\">, <\/font><font color=\"black\">id2<\/font><font color=\"gray\">, <\/font><font color=\"black\">data1<\/font><font color=\"gray\">, <\/font><font color=\"black\">data2<\/font><font color=\"gray\">)\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">SELECT <\/font><font color=\"black\">111<\/font><font color=\"gray\">, <\/font><font color=\"black\">0<\/font><font color=\"gray\">, <\/font><font color=\"magenta\">REPLICATE<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;a&#39;<\/font><font color=\"gray\">, <\/font><font color=\"black\">33<\/font><font color=\"gray\">), <\/font><font color=\"magenta\">REPLICATE<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;b&#39;<\/font><font color=\"gray\">, <\/font><font color=\"black\">8000<\/font><font color=\"gray\">);\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SET IDENTITY_INSERT <\/font><font color=\"black\">split_page&nbsp; <\/font><font color=\"blue\">OFF<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"blue\">ALTER <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\t<\/font><font color=\"blue\">DROP <\/font><font color=\"black\">EVENT sqlserver.page_split<\/font><font color=\"gray\">; \r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"green\">-- Wait to allow dispatch to complete\r\n\t<\/font><font color=\"blue\">WAITFOR <\/font><font color=\"black\">DELAY <\/font><font color=\"red\">&#39;00:00:01.000&#39; \r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SELECT <\/font><font color=\"black\">oTab.<\/font><font color=\"gray\">*\r\n\t&nbsp; , <\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID\r\n\t&nbsp; <\/font><font color=\"gray\">, <\/font><font color=\"black\">p.index_id\r\n\t&nbsp; <\/font><font color=\"gray\">, <\/font><font color=\"magenta\">OBJECT_NAME<\/font><font color=\"gray\">(<\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID<\/font><font color=\"gray\">)\r\n\t&nbsp; , <\/font><font color=\"black\">i.name\r\n\t<\/font><font color=\"blue\">FROM\r\n\t<\/font><font color=\"gray\">(\r\n\t<\/font><font color=\"blue\">SELECT \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"black\">XEvent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.query<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;.&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(@timestamp)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;datetime&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"magenta\">FILE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;file_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">page_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;page_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">database_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(action[@name=&#39;&#39;database_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">sql_text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(action[@name=&#39;&#39;sql_text&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;varchar(max)&#39;<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"blue\">FROM \r\n\t<\/font><font color=\"gray\">( \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">SELECT <\/font><font color=\"magenta\">CAST<\/font><font color=\"gray\">(<\/font><font color=\"black\">target_data <\/font><font color=\"blue\">AS XML<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">target_data \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.dm_xe_session_targets xst \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.dm_xe_sessions xs <\/font><font color=\"blue\">ON <\/font><font color=\"black\">xs.address <\/font><font color=\"blue\">= <\/font><font color=\"black\">xst.event_session_address \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">xs.name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;MonitorPageSplits&#39; \r\n\t<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">tab <\/font><font color=\"gray\">(<\/font><font color=\"black\">target_data<\/font><font color=\"gray\">) \r\n\tCROSS <\/font><font color=\"black\">APPLY target_data.nodes<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;\/RingBufferTarget\/event&#39;<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">EventNodes<\/font><font color=\"gray\">(<\/font><font color=\"black\">XEvent<\/font><font color=\"gray\">) \r\n\t) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">oTab\r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.dm_os_buffer_descriptors <\/font><font color=\"blue\">AS <\/font><font color=\"black\">obd\r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">obd.database_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">oTab.database_id\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"gray\">AND <\/font><font color=\"black\">obd.<\/font><font color=\"magenta\">FILE_ID <\/font><font color=\"blue\">= <\/font><font color=\"black\">oTab.<\/font><font color=\"magenta\">FILE_ID\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"gray\">AND <\/font><font color=\"black\">obd.page_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">oTab.page_id\r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.allocation_units au\r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">au.allocation_unit_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">obd.allocation_unit_id\r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.partitions p \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">p.partition_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">au.container_id&nbsp; \r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.indexes i\r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID <\/font><font color=\"blue\">= <\/font><font color=\"black\">i.<\/font><font color=\"magenta\">OBJECT_ID\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"gray\">AND <\/font><font color=\"black\">p.index_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">i.index_id\r\n\t<\/font><font color=\"green\">-- verify that there is only one data page \r\n\t<\/font><font color=\"blue\">DBCC <\/font><font color=\"black\">IND<\/font><font color=\"gray\">(<\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">, <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">, -<\/font><font color=\"black\">1<\/font><font color=\"gray\">);\r\n\t<\/font>\r\n\t<\/pre>\n<\/blockquote>\n<p>\nThe above code creates a table in tempdb, loads one page of data in it exactly as in Kalen&rsquo;s blog post, and then creates an Event Session for the sqlserver.page_split Event in tempdb, that also collects the sqlserver.database_id and sqlserver.sql_text actions when the Event fires.&nbsp; After triggering the page split, it drops the Event from the Event Session and then uses WAITFOR DELAY to allow the events to be buffered to the package0.ring_buffer Target.&nbsp; Then it shreds the XML and joins to the DMV&rsquo;s to get the object and index names.&nbsp; The output of running the above script in SQL Server 2008 should be similar to the following, showing 10 split events and 10 additional pages in the database table.\n<\/p>\n<p>\n&nbsp;<a href=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/4ed3f8c3\/image.png\" target=\"_blank\"><img fetchpriority=\"high\" decoding=\"async\" style=\"display: inline; border-width: 0px\" src=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png\" border=\"0\" alt=\"image\" title=\"image\" width=\"644\" height=\"364\" \/><\/a> .&nbsp;\n<\/p>\n<p>\nNote that the only two columns returned by the sqlserver.page_split Event are the file_id and page_id.&nbsp; In SQL Server Denali CTP1, the sqlserver.page_split event now has a much larger Event payload associated with it.&nbsp; It now returns the file_id, page_id, database_id (as a part of the event, not requiring an action), rowset_id, splitOperation, new_page_file_id, and the new_page_page_id associated with the page_split Event.&nbsp;&nbsp; This makes the Event much more useful and allows it to be used without having to query the buffer descriptors to find the object association.&nbsp; The following demo is identical to the demo for SQL Server 2008 listed above with the exception of that the XQuery is slightly different (a requirement to pull the new information from the XML).\n<\/p>\n<blockquote>\n<pre style=\"font-size: 12px\">\r\n\t<font color=\"green\">-- Create the table \r\n\t<\/font><font color=\"blue\">USE <\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SET NOCOUNT ON\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">IF <\/font><font color=\"gray\">EXISTS (<\/font><font color=\"blue\">SELECT <\/font><font color=\"gray\">* <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.tables\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;split_page&#39;<\/font><font color=\"gray\">)\r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">DROP TABLE <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">CREATE TABLE <\/font><font color=\"black\">split_page \r\n\t<\/font><font color=\"gray\">(<\/font><font color=\"black\">id <\/font><font color=\"blue\">INT <\/font><font color=\"#434343\">IDENTITY<\/font><font color=\"gray\">(<\/font><font color=\"black\">0<\/font><font color=\"gray\">,<\/font><font color=\"black\">2<\/font><font color=\"gray\">) <\/font><font color=\"blue\">PRIMARY KEY<\/font><font color=\"gray\">,\r\n\t<\/font><font color=\"black\">id2 bigint <\/font><font color=\"blue\">DEFAULT <\/font><font color=\"black\">0<\/font><font color=\"gray\">,\r\n\t<\/font><font color=\"black\">data1 <\/font><font color=\"blue\">VARCHAR<\/font><font color=\"gray\">(<\/font><font color=\"black\">33<\/font><font color=\"gray\">) NULL, \r\n\t<\/font><font color=\"black\">data2 <\/font><font color=\"blue\">VARCHAR<\/font><font color=\"gray\">(<\/font><font color=\"black\">8000<\/font><font color=\"gray\">) NULL);\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"green\">-- fill page until no more rows fit\r\n\t<\/font><font color=\"blue\">INSERT INTO <\/font><font color=\"black\">split_page <\/font><font color=\"blue\">DEFAULT VALUES<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO 385\r\n\t<\/font><font color=\"green\">-- verify that there is only one data page \r\n\t<\/font><font color=\"blue\">DBCC <\/font><font color=\"black\">IND<\/font><font color=\"gray\">(<\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">, <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">, -<\/font><font color=\"black\">1<\/font><font color=\"gray\">);\r\n\t<\/font><font color=\"green\">-- Create MonitorPageSplits Extended Event Session \r\n\t<\/font><font color=\"blue\">IF <\/font><font color=\"gray\">(<\/font><font color=\"blue\">SELECT <\/font><font color=\"black\">1 <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.server_event_sessions <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;MonitorPageSplits&#39;<\/font><font color=\"gray\">) <\/font><font color=\"blue\">IS <\/font><font color=\"gray\">NOT NULL \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">DROP <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\tGO \r\n\t<\/font><font color=\"blue\">CREATE <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\t<\/font><font color=\"blue\">ADD <\/font><font color=\"black\">EVENT sqlserver.page_split \r\n\t<\/font><font color=\"gray\">( \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"black\">ACTION <\/font><font color=\"gray\">(<\/font><font color=\"black\">sqlserver.database_id<\/font><font color=\"gray\">, <\/font><font color=\"black\">sqlserver.sql_text<\/font><font color=\"gray\">)&nbsp;&nbsp; \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">sqlserver.database_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">2 \r\n\t<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"blue\">ADD <\/font><font color=\"black\">TARGET package0.ring_buffer \r\n\t<\/font><font color=\"blue\">WITH <\/font><font color=\"gray\">(<\/font><font color=\"black\">MAX_DISPATCH_LATENCY <\/font><font color=\"blue\">= <\/font><font color=\"black\">1 SECONDS<\/font><font color=\"gray\">)\r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"green\">-- Start the MonitorPageSplits Event Session \r\n\t<\/font><font color=\"blue\">ALTER <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER STATE <\/font><font color=\"blue\">= <\/font><font color=\"black\">start<\/font><font color=\"gray\">; \r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"green\">-- Now insert one more row, this time filling the VARCHARs to the maximum length. \r\n\t<\/font><font color=\"blue\">SET IDENTITY_INSERT <\/font><font color=\"black\">split_page&nbsp; <\/font><font color=\"blue\">ON<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">INSERT INTO <\/font><font color=\"black\">split_page <\/font><font color=\"gray\">(<\/font><font color=\"black\">id<\/font><font color=\"gray\">, <\/font><font color=\"black\">id2<\/font><font color=\"gray\">, <\/font><font color=\"black\">data1<\/font><font color=\"gray\">, <\/font><font color=\"black\">data2<\/font><font color=\"gray\">)\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">SELECT <\/font><font color=\"black\">111<\/font><font color=\"gray\">, <\/font><font color=\"black\">0<\/font><font color=\"gray\">, <\/font><font color=\"magenta\">REPLICATE<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;a&#39;<\/font><font color=\"gray\">, <\/font><font color=\"black\">33<\/font><font color=\"gray\">), <\/font><font color=\"magenta\">REPLICATE<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;b&#39;<\/font><font color=\"gray\">, <\/font><font color=\"black\">8000<\/font><font color=\"gray\">);\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SET IDENTITY_INSERT <\/font><font color=\"black\">split_page&nbsp; <\/font><font color=\"blue\">OFF<\/font><font color=\"gray\">;\r\n\t<\/font><font color=\"black\">GO \r\n\t<\/font><font color=\"blue\">ALTER <\/font><font color=\"black\">EVENT SESSION MonitorPageSplits <\/font><font color=\"blue\">ON <\/font><font color=\"black\">SERVER \r\n\t<\/font><font color=\"blue\">DROP <\/font><font color=\"black\">EVENT sqlserver.page_split<\/font><font color=\"gray\">; \r\n\t<\/font><font color=\"red\">\r\n\t<\/font><font color=\"black\">GO\r\n\t<\/font><font color=\"blue\">SELECT \r\n\t&nbsp;&nbsp;&nbsp; <\/font><font color=\"black\">event_time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(@timestamp)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;datetime&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">orig_file_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;file_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">orig_page_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;page_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">database_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;database_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"magenta\">OBJECT_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID\r\n\t&nbsp; <\/font><font color=\"gray\">, <\/font><font color=\"black\">index_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">p.index_id\r\n\t&nbsp; <\/font><font color=\"gray\">, <\/font><font color=\"magenta\">OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"magenta\">OBJECT_NAME<\/font><font color=\"gray\">(<\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID<\/font><font color=\"gray\">)\r\n\t&nbsp; , <\/font><font color=\"black\">index_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">i.name\r\n\t&nbsp; <\/font><font color=\"gray\">, <\/font><font color=\"black\">rowset_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;rowset_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;bigint&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">splitOperation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;splitOperation&#39;&#39;]\/text)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;varchar(255)&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">new_page_file_id&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;new_page_file_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">new_page_page_id&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;new_page_page_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;int&#39;<\/font><font color=\"gray\">) \r\n\t&nbsp; , <\/font><font color=\"black\">sql_text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(action[@name=&#39;&#39;sql_text&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;varchar(max)&#39;<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"blue\">FROM \r\n\t<\/font><font color=\"gray\">( \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">SELECT <\/font><font color=\"magenta\">CAST<\/font><font color=\"gray\">(<\/font><font color=\"black\">target_data <\/font><font color=\"blue\">AS XML<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">target_data \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">FROM <\/font><font color=\"black\">sys.dm_xe_session_targets xst \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.dm_xe_sessions xs <\/font><font color=\"blue\">ON <\/font><font color=\"black\">xs.address <\/font><font color=\"blue\">= <\/font><font color=\"black\">xst.event_session_address \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">WHERE <\/font><font color=\"black\">xs.name <\/font><font color=\"blue\">= <\/font><font color=\"red\">&#39;MonitorPageSplits&#39; \r\n\t<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">tab <\/font><font color=\"gray\">(<\/font><font color=\"black\">target_data<\/font><font color=\"gray\">) \r\n\tCROSS <\/font><font color=\"black\">APPLY target_data.nodes<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;\/RingBufferTarget\/event&#39;<\/font><font color=\"gray\">) <\/font><font color=\"blue\">AS <\/font><font color=\"black\">EventNodes<\/font><font color=\"gray\">(<\/font><font color=\"black\">XEvent<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.allocation_units au\r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">au.container_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">XEvent.value<\/font><font color=\"gray\">(<\/font><font color=\"red\">&#39;(data[@name=&#39;&#39;rowset_id&#39;&#39;]\/value)[1]&#39;<\/font><font color=\"gray\">,<\/font><font color=\"red\">&#39;bigint&#39;<\/font><font color=\"gray\">) \r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.partitions p \r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">p.partition_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">au.container_id&nbsp; \r\n\t<\/font><font color=\"magenta\">LEFT <\/font><font color=\"blue\">JOIN <\/font><font color=\"black\">sys.indexes i\r\n\t&nbsp;&nbsp; <\/font><font color=\"blue\">ON <\/font><font color=\"black\">p.<\/font><font color=\"magenta\">OBJECT_ID <\/font><font color=\"blue\">= <\/font><font color=\"black\">i.<\/font><font color=\"magenta\">OBJECT_ID\r\n\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><font color=\"gray\">AND <\/font><font color=\"black\">p.index_id <\/font><font color=\"blue\">= <\/font><font color=\"black\">i.index_id\r\n\t<\/font><font color=\"green\">-- View the Page allocations \r\n\t<\/font><font color=\"blue\">DBCC <\/font><font color=\"black\">IND<\/font><font color=\"gray\">(<\/font><font color=\"black\">tempdb<\/font><font color=\"gray\">, <\/font><font color=\"black\">split_page<\/font><font color=\"gray\">, -<\/font><font color=\"black\">1<\/font><font color=\"gray\">);<\/font>\r\n\t<\/pre>\n<\/blockquote>\n<p>\nIf you run the above demo the output should be similar to the below (if you click on the picture, it will open up larger).&nbsp; One thing that should become immediately obvious is that the same demo in Denali is doing 1\/3rd of the page splits that occur in SQL Server 2008.&nbsp;\n<\/p>\n<p>\n<a href=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/1ee93135\/image3.png\" target=\"_blank\"><img decoding=\"async\" style=\"display: inline; border-width: 0px\" src=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/0127a676\/image3_thumb.png\" border=\"0\" alt=\"image\" title=\"image\" width=\"644\" height=\"337\" \/><\/a>\n<\/p>\n<p>\nThe old_page_id and new_page_id tell where the page originated and moved to, and the splitOperation tells the type of split.&nbsp; In this case only two of the type of splits are occurring; SPLIT_FOR_ROOT_NODE which occurs when the first page allocated is split into multiple pages, and SPLIT_FOR_INSERT which occurs as the inserts continue and the pages are split to accommodate the data.&nbsp; There are a number of additional split operations that exist in SQL Server Denali CTP1 including, SPLIT_FOR_DELETE, SPLIT_FOR_GHOST, SPLIT_FOR_INTERNAL_NODE, and SPLIT_FOR_UPDATE.&nbsp; I&rsquo;ve tried to figure out how to correlate the output from DBCC IND with the data held in the Event Session for page splits to correlate the old_page_id and new_page_id to identify problematic splits, but haven&rsquo;t finalized validation of my tests yet (hopefully I can finish this work and I&rsquo;ll write an update to this blog post showing how to do this at some point in the near future).&nbsp; One item that I have noted in my testing is that mid-page splits generally generate multiple sqlserver.page_split Events in the same operation, similar to the demonstrations used in this example, where as end-page splits for identity and sequential GUID inserts do not.&nbsp; I am not certain that this is a valid conclusion to come to at this point and have further testing to do to investigate page splits more.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nearly two years ago Kalen Delaney blogged about Splitting a page into multiple pages, showing how page splits occur inside of SQL Server.&nbsp; Following her blog post, Michael Zilberstein wrote a post, Monitoring Page Splits with Extended Events, that showed how to see the sqlserver.page_split Events using Extended Events.&nbsp; Eladio Rinc&oacute;n also blogged about Using [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,38,40,45],"tags":[],"class_list":["post-537","post","type-post","status-publish","format-standard","hentry","category-extended-events","category-sql-server-2008","category-sql-server-denali","category-xevent-a-day-series"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias<\/title>\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.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias\" \/>\n<meta property=\"og:description\" content=\"Nearly two years ago Kalen Delaney blogged about Splitting a page into multiple pages, showing how page splits occur inside of SQL Server.&nbsp; Following her blog post, Michael Zilberstein wrote a post, Monitoring Page Splits with Extended Events, that showed how to see the sqlserver.page_split Events using Extended Events.&nbsp; Eladio Rinc&oacute;n also blogged about Using [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/\" \/>\n<meta property=\"og:site_name\" content=\"Jonathan Kehayias\" \/>\n<meta property=\"article:published_time\" content=\"2010-12-27T22:38:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-13T17:05:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png\" \/>\n<meta name=\"author\" content=\"Jonathan Kehayias\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Kehayias\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/\"},\"author\":{\"name\":\"Jonathan Kehayias\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"headline\":\"An XEvent a Day (27 of 31) &#8211; The Future &#8211; Tracking Page Splits in SQL Server Denali CTP1\",\"datePublished\":\"2010-12-27T22:38:00+00:00\",\"dateModified\":\"2017-04-13T17:05:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/\"},\"wordCount\":865,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/trackingpagesplitsinsqlserverdenalictp1\\\/007ef04c\\\/image_thumb.png\",\"articleSection\":[\"Extended Events\",\"SQL Server 2008\",\"SQL Server Denali\",\"XEvent a Day Series\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/\",\"name\":\"An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/trackingpagesplitsinsqlserverdenalictp1\\\/007ef04c\\\/image_thumb.png\",\"datePublished\":\"2010-12-27T22:38:00+00:00\",\"dateModified\":\"2017-04-13T17:05:42+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/trackingpagesplitsinsqlserverdenalictp1\\\/007ef04c\\\/image_thumb.png\",\"contentUrl\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/trackingpagesplitsinsqlserverdenalictp1\\\/007ef04c\\\/image_thumb.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extended Events\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/category\\\/extended-events\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"An XEvent a Day (27 of 31) &#8211; The Future &#8211; Tracking Page Splits in SQL Server Denali CTP1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\",\"name\":\"Jonathan Kehayias - The Rambling DBA\",\"description\":\"The Rambling DBA\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\",\"name\":\"Jonathan Kehayias\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"caption\":\"Jonathan Kehayias\"},\"sameAs\":[\"http:\\\/\\\/3.209.169.194\\\/blogs\\\/jonathan\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias","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.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/","og_locale":"en_US","og_type":"article","og_title":"An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias","og_description":"Nearly two years ago Kalen Delaney blogged about Splitting a page into multiple pages, showing how page splits occur inside of SQL Server.&nbsp; Following her blog post, Michael Zilberstein wrote a post, Monitoring Page Splits with Extended Events, that showed how to see the sqlserver.page_split Events using Extended Events.&nbsp; Eladio Rinc&oacute;n also blogged about Using [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/","og_site_name":"Jonathan Kehayias","article_published_time":"2010-12-27T22:38:00+00:00","article_modified_time":"2017-04-13T17:05:42+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png","type":"","width":"","height":""}],"author":"Jonathan Kehayias","twitter_misc":{"Written by":"Jonathan Kehayias","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#article","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/"},"author":{"name":"Jonathan Kehayias","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"headline":"An XEvent a Day (27 of 31) &#8211; The Future &#8211; Tracking Page Splits in SQL Server Denali CTP1","datePublished":"2010-12-27T22:38:00+00:00","dateModified":"2017-04-13T17:05:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/"},"wordCount":865,"commentCount":0,"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png","articleSection":["Extended Events","SQL Server 2008","SQL Server Denali","XEvent a Day Series"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/","name":"An XEvent a Day (27 of 31) - The Future - Tracking Page Splits in SQL Server Denali CTP1 - Jonathan Kehayias","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png","datePublished":"2010-12-27T22:38:00+00:00","dateModified":"2017-04-13T17:05:42+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#primaryimage","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png","contentUrl":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/trackingpagesplitsinsqlserverdenalictp1\/007ef04c\/image_thumb.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/an-xevent-a-day-27-of-31-the-future-tracking-page-splits-in-sql-server-denali-ctp1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/"},{"@type":"ListItem","position":2,"name":"Extended Events","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/category\/extended-events\/"},{"@type":"ListItem","position":3,"name":"An XEvent a Day (27 of 31) &#8211; The Future &#8211; Tracking Page Splits in SQL Server Denali CTP1"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/","name":"Jonathan Kehayias - The Rambling DBA","description":"The Rambling DBA","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c","name":"Jonathan Kehayias","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","caption":"Jonathan Kehayias"},"sameAs":["http:\/\/3.209.169.194\/blogs\/jonathan"]}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/comments?post=537"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/537\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/media?parent=537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/categories?post=537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/tags?post=537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}