{"id":45477,"date":"2026-07-08T16:59:04","date_gmt":"2026-07-08T14:59:04","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=45477"},"modified":"2026-07-08T16:59:07","modified_gmt":"2026-07-08T14:59:07","slug":"measuring-the-real-performance-cost-of-sql-server-xe-buffers","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/","title":{"rendered":"Measuring the real performance cost of SQL Server XE buffers"},"content":{"rendered":"\n<h2 id=\"h-context\" class=\"wp-block-heading\">Context<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Extended Events have a reputation for being lightweight, and most of the time they are. However, poorly configured setups can heavily degrade your SQL Server Extended Events performance, stalling application threads and keeping a disk busy for minutes after your workload has ended. The events you choose to capture matter just as much as the session settings: some events, like the showplan ones, carry a heavy cost by design regardless of how you configure the rest of the session. I wanted to see what all of this looks like from the DMV side, so I built the worst XE session I could think of, threw a StackOverflow workload at it, and compared the numbers with a healthy session.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two DMVs are enough for this analysis:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>sys.dm_xe_sessions<\/code> for buffer state, data volume and dropped events<br><code>sys.dm_os_wait_stats<\/code> for the wait types produced by the XE <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep in mind that both are in-memory structures. The counters in sys.dm_xe_sessions accumulate since the session started (create_time), and sys.dm_os_wait_stats accumulates since the instance started but everything resets after a restart. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also note that wait statistics are instance-wide: if several XE sessions run at the same time, the XE wait types aggregate all of them (that&#8217;s why we will focus on one specific XE called <em>XE_STRESS_TEST<\/em>, all others are disabled even the built-in ones).<\/p>\n\n\n\n<h2 id=\"h-monitoring-with-sys-dm-xe-sessions\" class=\"wp-block-heading\">Monitoring with sys.dm_xe_sessions<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT \n    s.name AS session_name,\n    s.dropped_event_count,\n    s.dropped_buffer_count,\n    s.buffer_policy_desc,\n    CAST(ROUND(s.total_buffer_size \/ 1024.0 \/ 1024.0, 2) AS FLOAT) AS total_buffer_size_mb,\n    s.total_regular_buffers,\n    CAST(ROUND(s.regular_buffer_size \/ 1024.0 \/ 1024.0, 2) AS FLOAT) AS regular_buffer_size_mb,\n    s.buffer_processed_count,\n    CAST(ROUND(s.total_bytes_generated \/ 1024.0 \/ 1024.0, 2) AS FLOAT) AS total_bytes_generated_mb,\n    DATEDIFF(MINUTE, s.create_time, GETDATE()) AS session_age_minutes,\n    CAST(ROUND(s.total_bytes_generated \/ 1024.0 \/ 1024.0 \n         \/ NULLIF(DATEDIFF(MINUTE, s.create_time, GETDATE()), 0), 2) AS FLOAT) AS bytes_generated_mb_per_minute,\n    CAST(ROUND(s.dropped_event_count * 1.0 \n         \/ NULLIF(DATEDIFF(MINUTE, s.create_time, GETDATE()), 0), 2) AS FLOAT) AS dropped_event_count_per_minute\nFROM sys.dm_xe_sessions s\nWHERE s.name = &#039;&lt;XE_NAME&gt;&#039;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Since the counters are cumulative, a single snapshot tells you very little. What you want to know is whether they increase between two runs of the query. In practice:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Column<\/strong><\/td><td><strong>What an increase means<\/strong><\/td><\/tr><tr><td><code>dropped_event_count<\/code><\/td><td>The server sacrificed events because it could not keep up with the volume<\/td><\/tr><tr><td><code>dropped_buffer_count<\/code><\/td><td>Entire buffers were lost, usually because the target cannot drain them fast enough<\/td><\/tr><tr><td><code>buffer_processed_count<\/code><\/td><td>Normal activity<\/td><\/tr><tr><td><code>bytes_generated_mb_per_minute<\/code><\/td><td>The session captures more data than expected for its age<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>buffer_policy_desc<\/code> is worth a look too: <code>drop_event<\/code> means the session is asynchronous and accepts losing events under pressure, <code>block<\/code> means <code>NO_EVENT_LOSS<\/code> was configured and application threads will wait instead of dropping anything. More on that below.<\/p>\n\n\n\n<h2 id=\"h-monitoring-the-xe-wait-types\" class=\"wp-block-heading\">Monitoring the XE wait types<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are more XE-related wait types than this, but after testing I only kept the three that actually tell you something:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT \n    wait_type,\n    waiting_tasks_count,\n    wait_time_ms,\n    max_wait_time_ms,\n    CAST(wait_time_ms * 1.0 \/ NULLIF(waiting_tasks_count, 0) AS DECIMAL(10,2)) AS avg_wait_time_ms\nFROM sys.dm_os_wait_stats\nWHERE wait_type IN (\n    &#039;XE_TIMER_EVENT&#039;,\n    &#039;XE_DISPATCHER_WAIT&#039;,\n    &#039;PREEMPTIVE_XE_DISPATCHER&#039;\n)\nAND waiting_tasks_count &gt; 0\nORDER BY wait_time_ms DESC;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.sqlskills.com\/help\/waits\/xe_timer_event\/\"><code>XE_TIMER_EVENT<\/code> <\/a>is the dispatcher thread waiting for the next flush cycle defined by <code>MAX_DISPATCH_LATENCY<\/code>. It is always present and always harmless.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.sqlskills.com\/help\/waits\/xe_dispatcher_wait\/\"><code>XE_DISPATCHER_WAIT<\/code> <\/a>is the dispatcher waiting for buffers to process. Counter-intuitively, a high average is good news: the dispatcher spends its time waiting for work. A very low average means it never gets to rest between flushes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/databasehealth.com\/server-overview\/waits-by-type\/preemptive-waits\/preemptive_xe_dispatcher\/\" id=\"https:\/\/databasehealth.com\/server-overview\/waits-by-type\/preemptive-waits\/preemptive_xe_dispatcher\/\"><code>PREEMPTIVE_XE_DISPATCHER<\/code> <\/a>occurs when the dispatcher switches to preemptive mode to execute an operation outside of SQLOS control, typically writing event data to disk through an OS call. It shows up under high XE load, during OS interactions, or when the storage cannot absorb the writes. On a healthy instance this stays at zero. When it starts growing, your XE session has become a real workload for the server.<\/p>\n\n\n\n<h2 id=\"h-a-healthy-reference-point\" class=\"wp-block-heading\">A healthy reference point<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On my lab, the <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/extended-events\/use-the-system-health-session?view=sql-server-ver17\"><code>system_health<\/code> <\/a>session has been running for about 132 days:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"38\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1024x38.png\" alt=\"\" class=\"wp-image-45479\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1024x38.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-300x11.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-768x29.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1536x58.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image.png 1677w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"901\" height=\"110\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1.png\" alt=\"\" class=\"wp-image-45480\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1.png 901w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1-300x37.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1-768x94.png 768w\" sizes=\"auto, (max-width: 901px) 100vw, 901px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">4 GB in 132 days, nothing dropped. On the wait side, <code>XE_DISPATCHER_WAIT<\/code> averages around 57 seconds per wait, meaning the dispatcher spends almost a minute idle between two buffers, and <code>PREEMPTIVE_XE_DISPATCHER<\/code> sits at 0 ms. That is what an XE session that nobody notices looks like.<\/p>\n\n\n\n<h2 id=\"h-building-a-session-that-hurts\" class=\"wp-block-heading\">Building a session that hurts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now the opposite. This session combines everything you should not do:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE EVENT SESSION &#x5B;XE_STRESS_TEST] ON SERVER\nADD EVENT sqlserver.sql_statement_completed (\n    ACTION (\n        sqlserver.sql_text,\n        sqlserver.query_hash,\n        sqlserver.query_plan_hash,\n        sqlserver.plan_handle,\n        sqlserver.username,\n        sqlserver.database_name,\n        sqlserver.client_hostname,\n        package0.collect_system_time\n    )\n),\nADD EVENT sqlserver.query_post_execution_showplan (\n    ACTION (\n        sqlserver.sql_text,\n        sqlserver.database_name,\n        package0.collect_system_time\n    )\n)\nADD TARGET package0.event_file (\n    SET filename = N&#039;C:\\XE\\XE_STRESS_TEST.xel&#039;,\n        max_file_size = 10,\n        max_rollover_files = 999\n)\nWITH (\n    MAX_MEMORY = 512 KB,\n    EVENT_RETENTION_MODE = NO_EVENT_LOSS,\n    MAX_DISPATCH_LATENCY = 1 SECONDS,\n    MAX_EVENT_SIZE = 10240 KB,\n    MEMORY_PARTITION_MODE = NONE,\n    TRACK_CAUSALITY = ON,\n    STARTUP_STATE = OFF\n);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Why each configuration option is a bad idea:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>query_post_execution_showplan <\/code>captures the full XML execution plan of every single query. A plan can weigh several hundred KB, sometimes a couple of MB. Microsoft documents this event as having performance overhead (<a href=\"https:\/\/learn.microsoft.com\/en-us\/shows\/SQL-Workshops\/Extended-Event-Query-Post-Execution-Showplan-in-SQL-Server\" id=\"https:\/\/learn.microsoft.com\/en-us\/shows\/SQL-Workshops\/Extended-Event-Query-Post-Execution-Showplan-in-SQL-Server\">link<\/a>).<\/li>\n\n\n\n<li><code>MAX_MEMORY = 512 KB<\/code> gives the session a tiny buffer pool that fills up after a handful of events once plans are involved, so the dispatcher flushes constantly.<\/li>\n\n\n\n<li><code>NO_EVENT_LOSS<\/code> tells SQL Server that losing an event is not acceptable. The consequence is that any thread firing an event while all buffers are full has to wait. Your queries pay for the XE session.<\/li>\n\n\n\n<li><code>MAX_DISPATCH_LATENCY = 1 SECONDS<\/code> forces a flush cycle every second no matter what.<\/li>\n\n\n\n<li><code>TRACK_CAUSALITY = ON<\/code> adds a GUID and a sequence number to every event, which costs a bit of CPU and space each time (<a href=\"https:\/\/sqlperformance.com\/2019\/01\/extended-events\/using-track-causality-to-understand-query-execution\" id=\"https:\/\/sqlperformance.com\/2019\/01\/extended-events\/using-track-causality-to-understand-query-execution\">link to the documentation<\/a>).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To create the pressure on this XE, the workload was as follows: 10 parallel SSMS sessions, each running 1 000 iterations of joins between Posts, Users and Votes on the StackOverflow database, with a variable predicate so that no plan gets reused and every execution produces a fresh showplan event (the query is not important here, the only goal is to generate workload so that the XE has something heavy to capture).<\/p>\n\n\n\n<h2 id=\"h-weighting-the-damages\" class=\"wp-block-heading\">Weighting the damages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Early in the load, the session had already generated 1 GB. Nothing dropped, <code>PREEMPTIVE_XE_DISPATCHER<\/code> still at zero, but the average of <code>XE_DISPATCHER_WAIT<\/code> was down to 6 ms. The dispatcher was already working non-stop, the disk was simply keeping up so far.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"193\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv-1024x193.png\" alt=\"\" class=\"wp-image-45485\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv-1024x193.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv-300x57.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv-768x145.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv-1536x289.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_midload_dmv.png 1821w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A minute later the picture changed completely. 2.5 GB generated, and <code>PREEMPTIVE_XE_DISPATCHER<\/code> had jumped to over 1 168 690 ms accumulated. The dispatcher was now spending its life in preemptive mode, out of SQLOS control, waiting for the OS to complete disk writes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"167\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2-1024x167.png\" alt=\"\" class=\"wp-image-45491\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2-1024x167.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2-300x49.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2-768x125.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2-1536x250.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-2.png 1809w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then the interesting part. The 10 load sessions finished, and the XE session kept writing. With <code>NO_EVENT_LOSS<\/code> and a 512 KB pool, a backlog of buffers had piled up in memory during the load, and the dispatcher was draining it file after file. The <code>max_wait_time_ms<\/code> of <code>XE_DISPATCHER_WAIT<\/code> climbed to 74 seconds while <code>total_bytes_generated_mb<\/code> barely moved: the disk was the bottleneck.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"179\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3-1024x179.png\" alt=\"\" class=\"wp-image-45493\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3-1024x179.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3-300x52.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3-768x134.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3-1536x268.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-3.png 1817w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Eight minutes after the session started, the tally was 5.4 GB written, more than 500 rollover files of 10 MB on disk, for a workload that had ended long before.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"170\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits-1024x170.png\" alt=\"\" class=\"wp-image-45486\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits-1024x170.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits-300x50.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits-768x128.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits-1536x256.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/xe_peak_waits.png 1868w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 id=\"h-healthy-vs-stressed-side-by-side\" class=\"wp-block-heading\">Healthy vs stressed, side by side<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Metric<\/strong><\/td><td><strong>system_health<\/strong><\/td><td><strong>XE_STRESS_TEST<\/strong><\/td><\/tr><tr><td><code>total_bytes_generated_mb<\/code><\/td><td>4&#8217;083 MB in 132 days<\/td><td>5&#8217;410 MB in 8 minutes<\/td><\/tr><tr><td><code>bytes_generated_mb_per_minute<\/code><\/td><td>0.02<\/td><td>~676<\/td><\/tr><tr><td><code>dropped_event_count<\/code><\/td><td>0<\/td><td>0<\/td><\/tr><tr><td><code>XE_DISPATCHER_WAIT avg<\/code><\/td><td>~57&#8217;000 ms<\/td><td>6 to 25 ms<\/td><\/tr><tr><td><code>PREEMPTIVE_XE_DISPATCHER<\/code><\/td><td>0 ms<\/td><td>over 1&#8217;168&#8217;000 ms<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><span style=\"text-decoration: underline\">Note <\/span><\/strong>the trap on <code>dropped_event_count<\/code>: both sessions show zero, for opposite reasons. The healthy session drops nothing because it has nothing to drop. The stressed session drops nothing because <code>NO_EVENT_LOSS<\/code> made the application threads wait instead. Looking at that counter alone, both sessions look fine. Only the wait types reveal the difference.<\/p>\n\n\n\n<h2 id=\"h-final-thoughts-protecting-your-production-from-xe-overhead\" class=\"wp-block-heading\">Final Thoughts: Protecting Your Production from XE Overhead<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>NO_EVENT_LOSS<\/code> does not buy you capacity, it converts event loss into query latency. It has its place for a short targeted capture where completeness matters, never for a permanent session.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>query_post_execution_showplan<\/code> without a predicate will drown any buffer configuration. If you need to capture it, scope it to a database or an object using predicates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An undersized <code>MAX_MEMORY<\/code> turns every couple of events into a flush, and every flush is an opportunity for the dispatcher to end up in <code>PREEMPTIVE_XE_DISPATCHER<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And check both DMVs, not just one. <code>sys.dm_xe_sessions<\/code> tells you what happened to your data, <code>sys.dm_os_wait_stats<\/code> tells you what it cost the server. In my stress test, the first one looked almost reassuring. The second one did not.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.<\/p>\n","protected":false},"author":157,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[368,99],"tags":[1160,895,67,51],"type_dbi":[],"class_list":["post-45477","post","type-post","status-publish","format-standard","hentry","category-development-performance","category-sql-server","tag-dmv","tag-extended-events","tag-performance","tag-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Measuring the real performance cost of SQL Server XE buffers<\/title>\n<meta name=\"description\" content=\"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.\" \/>\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\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Measuring the real performance cost of SQL Server XE buffers\" \/>\n<meta property=\"og:description\" content=\"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-08T14:59:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-08T14:59:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1677\" \/>\n\t<meta property=\"og:image:height\" content=\"63\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Louis Tochon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Louis Tochon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 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\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/\"},\"author\":{\"name\":\"Louis Tochon\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/e4195b0cb120295b3407a502c23e75b6\"},\"headline\":\"Measuring the real performance cost of SQL Server XE buffers\",\"datePublished\":\"2026-07-08T14:59:04+00:00\",\"dateModified\":\"2026-07-08T14:59:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/\"},\"wordCount\":1116,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/07\\\/image-1024x38.png\",\"keywords\":[\"DMV\",\"extended events\",\"Performance\",\"SQL Server\"],\"articleSection\":[\"Development &amp; Performance\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/\",\"name\":\"Measuring the real performance cost of SQL Server XE buffers\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/07\\\/image-1024x38.png\",\"datePublished\":\"2026-07-08T14:59:04+00:00\",\"dateModified\":\"2026-07-08T14:59:07+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/e4195b0cb120295b3407a502c23e75b6\"},\"description\":\"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/07\\\/image.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/07\\\/image.png\",\"width\":1677,\"height\":63},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Measuring the real performance cost of SQL Server XE buffers\"}]},{\"@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\\\/e4195b0cb120295b3407a502c23e75b6\",\"name\":\"Louis Tochon\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"caption\":\"Louis Tochon\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/louistochon\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Measuring the real performance cost of SQL Server XE buffers","description":"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.","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\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/","og_locale":"en_US","og_type":"article","og_title":"Measuring the real performance cost of SQL Server XE buffers","og_description":"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.","og_url":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/","og_site_name":"dbi Blog","article_published_time":"2026-07-08T14:59:04+00:00","article_modified_time":"2026-07-08T14:59:07+00:00","og_image":[{"width":1677,"height":63,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image.png","type":"image\/png"}],"author":"Louis Tochon","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Louis Tochon","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/"},"author":{"name":"Louis Tochon","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e4195b0cb120295b3407a502c23e75b6"},"headline":"Measuring the real performance cost of SQL Server XE buffers","datePublished":"2026-07-08T14:59:04+00:00","dateModified":"2026-07-08T14:59:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/"},"wordCount":1116,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1024x38.png","keywords":["DMV","extended events","Performance","SQL Server"],"articleSection":["Development &amp; Performance","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/","url":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/","name":"Measuring the real performance cost of SQL Server XE buffers","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image-1024x38.png","datePublished":"2026-07-08T14:59:04+00:00","dateModified":"2026-07-08T14:59:07+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e4195b0cb120295b3407a502c23e75b6"},"description":"Are Extended Events always lightweight? See how a bad config converts event loss into query latency through DMVs.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/07\/image.png","width":1677,"height":63},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/measuring-the-real-performance-cost-of-sql-server-xe-buffers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Measuring the real performance cost of SQL Server XE buffers"}]},{"@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\/e4195b0cb120295b3407a502c23e75b6","name":"Louis Tochon","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","caption":"Louis Tochon"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/louistochon\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45477","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\/157"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=45477"}],"version-history":[{"count":21,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45477\/revisions"}],"predecessor-version":[{"id":45538,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45477\/revisions\/45538"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=45477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=45477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=45477"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=45477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}