{"id":107414,"date":"2025-07-25T12:00:00","date_gmt":"2025-07-25T12:00:00","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=107414"},"modified":"2026-03-09T12:40:02","modified_gmt":"2026-03-09T12:40:02","slug":"measuring-replication-latency-in-sql-server-synchronous-availability-groups","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/measuring-replication-latency-in-sql-server-synchronous-availability-groups\/","title":{"rendered":"Measure Replication Latency in SQL Server AlwaysOn AGs"},"content":{"rendered":"\n<p>Synchronous replicas in <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/database-engine\/availability-groups\/windows\/overview-of-always-on-availability-groups-sql-server?view=sql-server-ver17\" target=\"_blank\" rel=\"noreferrer noopener\">SQL Server Availability Groups<\/a> promise no data loss, but they don\u2019t promise zero delay; under heavy load they can still fall behind. To measure replication latency between synchronous replicas in SQL Server AlwaysOn Availability Groups, monitor two performance counters: Mirrored Write Transactions\/sec and Transaction Delay. <\/p>\n\n\n\n<p>These counters reveal how much time each transaction spends waiting for the secondary to acknowledge receipt &#8211; even in synchronous mode, latency accumulates under heavy I\/O workloads like index rebuilds or bulk data loads. This article shows how to capture these counters over time, calculate effective replication delay, and use the data to schedule maintenance operations safely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-measure-latency\">Why Measure Latency?<\/h2>\n\n\n\n<p>Availability Groups are useful for creating Highly Available (HA) database systems, but that doesn\u2019t mean they are entirely immune to performance problems. In busy systems, limitations in the infrastructure can introduce replication lag that is severe enough to affect database performance in ways that aren\u2019t immediately obvious.<\/p>\n\n\n\n<p>In <strong><a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/database-engine\/availability-groups\/windows\/overview-of-always-on-availability-groups-sql-server?view=sql-server-ver17\" target=\"_blank\" rel=\"noreferrer noopener\">SQL Server Availability Groups<\/a><\/strong>, the relevant difference between <strong>synchronous<\/strong> and <strong>asynchronous<\/strong> replicas comes down to <em>how and when<\/em> a transaction on the primary server is considered &#8220;committed&#8221;: Although it is easy to measure the lag between asynchronous replicas by using the dashboard in <a href=\"https:\/\/learn.microsoft.com\/en-us\/ssms\/install\/install\" target=\"_blank\" rel=\"noreferrer noopener\">SSMS<\/a> or by querying the <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/system-dynamic-management-views\/system-dynamic-management-views?view=sql-server-ver17\" target=\"_blank\" rel=\"noreferrer noopener\">DMVs (Dynamic Management Views)<\/a>, it takes more work to find the latency between synchronous replicas. This article explains how to measure that latency using internal performance counters, offering a simple technique for monitoring the cost of synchronous replication.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-effect-of-stress-on-a-synchronous-replica\">The Effect of Stress on a Synchronous Replica<\/h2>\n\n\n\n<p>You might think that there would be no delay in committing the transaction on the primary only after it is safely on the secondary &#8211; after all it is supposed to be synchronous. However, if you work with a busy server using AlwaysOn including synchronous replicas, you may have seen high numbers of <a href=\"https:\/\/techcommunity.microsoft.com\/blog\/sqlserver\/troubleshooting-high-hadr-sync-commit-wait-type-with-always-on-availability-grou\/385369\" target=\"_blank\" rel=\"noreferrer noopener\">HADR_SYNC_COMMIT<\/a> waits, especially during IO-intensive operations such as index rebuilds or data loads. This type of wait means \u2018<em>Your synchronous replica can\u2019t keep up!<\/em>\u2019 <\/p>\n\n\n\n<p>By understanding why this happens, we can learn about the nature of the bottlenecks in our infrastructure and throttle or reschedule operations to reduce the risk of replication latency.<\/p>\n\n\n\n<p><strong>Read also:<\/strong> <a href=\"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/t-sql-programming-sql-server\/beginner-guide-to-in-memory-optimized-tables-in-sql-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">In-memory optimized tables for high-throughput workloads<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-understanding-the-counters\">Understanding the Counters<\/h2>\n\n\n\n<p>Our first (but not last!) step in understanding counters should be the documentation, so let\u2019s take a look at <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/performance-monitor\/sql-server-database-replica\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/performance-monitor\/sql-server-database-replica<\/a>.<\/p>\n\n\n\n<p>The two metrics that we will use are Mirrored Write Transaction\/sec and Transaction Delay. Let\u2019s see what the documents say:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"109\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-24.png\" alt=\"Definition of Mirrored Write Transaction\/sec in SQL Server: Number of transactions that wrote to the mirrored database and waited for the log to be sent to the mirror in order to commit, in the last second.\" class=\"wp-image-107415\" srcset=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-24.png 940w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-24-300x35.png 300w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-24-768x89.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"127\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-25.png\" alt=\"Transaction Delay in SQL Server definition: Delay in waiting for unterminated commit acknowledgment for all the current transactions, in milliseconds. Divide by Mirrored Write Transaction\/sec to get Avg Transaction Delay.\" class=\"wp-image-107416\" srcset=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-25.png 940w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-25-300x41.png 300w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-25-768x104.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p><strong>Read also:<\/strong> <a href=\"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/t-sql-programming-sql-server\/temporary-tables-in-sql-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">Temporary tables and tempdb performance in SQL Server<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-mirrored-write-transaction-sec\">Mirrored Write Transaction\/sec<\/h2>\n\n\n\n<p>With these metrics, we can start by seeing what Mirrored Write Transaction\/sec looks like on a system with no traffic. For this I will use the <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/system-dynamic-management-views\/sys-dm-os-performance-counters-transact-sql?view=sql-server-ver17\" target=\"_blank\" rel=\"noreferrer noopener\">sys.dm_os_performance_counters<\/a> dynamic management view (DMV) that lets you see the OS performance counters that SQL Server is presenting to the OS performance monitor.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:tsql decode:true \">SELECT\n\tinstance_name\n\t,CAST(cntr_value AS BIGINT) counter_value\n\t,counter_name\nFROM\n\tsys.dm_os_performance_counters perf\nWHERE object_name LIKE 'SQLServer:Database Replica%'\n\tAND perf.counter_name LIKE 'Mirrored Write Transactions\/sec%'\n\tAND instance_name = '_Total';\n<\/pre><\/div>\n\n\n\n<p>When you execute this statement, it returns:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"66\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-26.png\" alt=\"An image showing what the statement returns - a table including instance_name, counter_value, and counter_name.\" class=\"wp-image-107417\" srcset=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-26.png 519w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-26-300x38.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>If the documentation is to be taken literally, this means that our offline system had 106,512,300 transactions in the last second \u2013 quite the load if you believe that number! If we wait about a minute and execute the query again on our system, the result shows a very similar number \u2013 106,512,310. Too similar if you ask me! This smells like a tally rather than a metric: maybe a tally of how much time the server has spent waiting on synchronous replicas. We need to investigate.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"59\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-27.png\" alt=\"A similar return result for the executed statement.\" class=\"wp-image-107418\" srcset=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-27.png 498w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-27-300x36.png 300w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>By running this query several times, it becomes apparent that the counter actually tracks a cumulative number of transactions since the last reboot or counter reset, rather than reflecting activity within the last second.<\/p>\n\n\n\n<p>With this understanding, we can rewrite the Microsoft definition:<\/p>\n\n\n\n<p><em><strong>Mirrored Write Transaction\/sec:<\/strong><\/em> <em>Number of transactions that were written to the primary database and then waited to commit until the log was sent to the secondary database, since the last reboot.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-transaction-delay\">Transaction Delay<\/h2>\n\n\n\n<p>Thankfully, Transaction Delay does exactly what it says on the tin. The tin&nbsp;also helpfully notes that we can divide this value by the Mirrored Write Transactions\/sec counter to get an average delay per transaction.<\/p>\n\n\n\n<p>Dividing these counters will give us the average latency since the last reboot but this, by itself, is not particularly useful in this context. We are more likely to need to know how closely the latency relates to various types of server load.<\/p>\n\n\n\n<p>Despite the \/sec suffix, most of these counters are actually just cumulative tallies. You have to do your own math if you want the actual per-second rate.<\/p>\n\n\n\n<section id=\"my-first-block-block_37102809969320bfdb918ea0d3a4287a\" class=\"my-first-block alignwide\">\n    <div class=\"bg-brand-600 text-base-white py-5xl px-4xl rounded-sm bg-gradient-to-r from-brand-600 to-brand-500 red\">\n        <div class=\"gap-4xl items-start md:items-center flex flex-col md:flex-row justify-between\">\n            <div class=\"flex-1 col-span-10 lg:col-span-7\">\n                <h3 class=\"mt-0 font-display mb-2 text-display-sm\">Fast, reliable and consistent SQL Server development&#8230;<\/h3>\n                <div class=\"child:last-of-type:mb-0\">\n                                            &#8230;with SQL Toolbelt Essentials. 10 ingeniously simple tools for accelerating development, reducing risk, and standardizing workflows.                                    <\/div>\n            <\/div>\n                                            <a href=\"https:\/\/www.red-gate.com\/products\/sql-toolbelt-essentials\/\" class=\"btn btn--secondary btn--lg\" aria-label=\"Learn more &amp; try for free: Fast, reliable and consistent SQL Server development...\">Learn more &amp; try for free<\/a>\n                    <\/div>\n    <\/div>\n<\/section>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-storing-the-counters\">Storing the Counters<\/h2>\n\n\n\n<p>If we store these values over time, we can then calculate a minute-by-minute metric that is far more useful for understanding the speed and robustness of a system. To do this we will create a table to track these counters and a stored procedure to write to that table at a regular cadence.<\/p>\n\n\n\n<p>Let\u2019s start by creating a table to hold our observations:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:tsql decode:true \">IF (SELECT object_id('dbo.AGLagObservations')) IS NULL\nCREATE TABLE dbo.AGLagObservations\n(\n    id            INT          IDENTITY(1,1)\n    ,instance_name SYSNAME\n    ,trancount     BIGINT\n    ,totaldelayMS  BIGINT\n    ,ts            DATETIME2(7) DEFAULT (getdate())\n)\n<\/pre><\/div>\n\n\n\n<p>Since these counters are stored in the same column in sys.dm_os_performance_counters, our procedure will use a temp table to pivot them into separate columns, making further analysis easier.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:tsql decode:true \">CREATE OR ALTER PROC dbo.CreateAGLagObservation\nAS\nBEGIN\n\tCREATE TABLE #t\n\t(\n\t\tinstance_name SYSNAME\n\t\t,counter_value BIGINT\n\t\t,counter_name  SYSNAME\n\t)\n--Fetch all the counters we want into one temp table\n\tINSERT INTO #t\n\t\t(instance_name,counter_value,counter_name)\n\tSELECT\n\t\tinstance_name\n\t\t,CAST(cntr_value AS BIGINT) counter_value\n\t\t,counter_name\n\tFROM\tsys.dm_os_performance_counters perf\n\tWHERE object_name LIKE 'SQLServer:Database Replica%'\n\tAND (perf.counter_name \n            LIKE 'Mirrored Write Transactions\/sec%'\n\tOR perf.counter_name LIKE 'Transaction Delay%')\n\n\t--Join the temp table to itself to flatten the two \n\t--counters into one row\n\tINSERT INTO dbo.AGLagObservations\n\t\t(instance_name, trancount,totaldelayMS)\n\tSELECT\n\t\tt1.instance_name\n\t\t,t1.counter_value \n\t\t,t2.counter_value\n\tFROM\t#t t1 --'Mirrored Write Transactions\/sec%'\n\tJOIN #t t2 --'Transaction Delay%'\nON t1.instance_name = t2.instance_name\n\tAND t1.counter_name \n               LIKE 'Mirrored Write Transactions\/sec%'\n\tAND t2.counter_name LIKE 'Transaction Delay%';\nEND\nGO\n<\/pre><\/div>\n\n\n\n<p>Now we can start a loop to gather our data. This code can be placed in a <a href=\"https:\/\/learn.microsoft.com\/en-us\/ssms\/agent\/create-a-job\" target=\"_blank\" rel=\"noreferrer noopener\">SQL Agent Job<\/a> or just kicked off from SSMS:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:tsql decode:true \">DECLARE @stop_time_local DATETIME2(7) = GETDATE() + 1\n\t, @time_delay VARCHAR(10) = '00:01:00'\n\t, @now DATETIME2(7) = GETDATE()\n\nWHILE @now &lt; @stop_time_local\nBEGIN\n\tEXEC dbo.CreateAGLagObservation\n\tSELECT @now = GETDATE()\n\tWAITFOR DELAY @TIME_DELAY\nEND<\/pre><\/div>\n\n\n\n<p>You could also just use a job that runs every minute or so to execute: <em>EXEC dbo.CreateAGLagObservation<\/em>, depending on your infrastructure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-analyzing-latency-trends-over-time\">Analyzing Latency Trends Over Time<\/h2>\n\n\n\n<p>After the script has been running for a few minutes, we can calculate and view the lag from the observations we have captured. This code uses a CTE to compare each row with the row captured before it to show how much each counter changed in the last minute. Then it divides those delta values to show the average delay per transaction in that minute (delay_ms_per_tran). I\u2019m filtering on instance_name here to show the total for all databases, but I have left this unfiltered in the stored procedure to allow tracking the latency for each database independently.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:tsql decode:true \">;WITH a AS (\nSELECT\nbegin_time = lag(CAST( ts AS DATETIME2(0)))\n\tOVER (PARTITION BY instance_name \n\t\tORDER BY id\n\t) \n,end_time = CAST( ts AS DATETIME2(0))\n,instance_name\n,id\n,trancount_delta = trancount \n\t- lag (trancount) \n\tOVER (PARTITION BY instance_name \n\t\tORDER BY id\n\t) \n,totaldelayMS_delta = totaldelayMS \n\t- lag (totaldelayMS) \n\tOVER (PARTITION  BY instance_name \n\t\tORDER BY id\n\t)\nFROM dbo.AGLagObservations\n)\nSELECT\tTOP 100\nCAST(\n\tCASE WHEN trancount_delta &gt; 0 \n\tTHEN totaldelayMS_delta * 1.0 \/trancount_delta\n\tELSE 0 END \n\tAS NUMERIC(19,2)) AS delay_ms_per_tran\n,begin_time\n,end_time\n,trancount_delta\n,totaldelayMS_delta\nFROM \ta\nWHERE instance_name = '_Total'\nORDER BY id DESC<\/pre><\/div>\n\n\n\n<p>To show why this can be so useful, I ran these scripts on a testing system with an insert statement running in a loop. To generate a more intensive load and stress the system, I rebuilt some indexes and highlighted those times in the screenshot below. You can clearly see how the index rebuilds affected the latency of the synchronous replication, going from sub-millisecond lag to over 20 milliseconds:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"464\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-28.png\" alt=\"An image of a table which shows how the index rebuilds affected the latency of the synchronous replication, going from sub-millisecond lag to over 20 millioseconds.\" class=\"wp-image-107419\" srcset=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-28.png 789w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-28-300x176.png 300w, https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2025\/07\/image-28-768x452.png 768w\" sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-summary\">Summary<\/h2>\n\n\n\n<p>We\u2019ve shown how to measure the latency between synchronous replicas in an Availability Group using SQL Server\u2019s own counters. While synchronous commit promises no data loss, it doesn\u2019t guarantee no delay \u2014 and under load, the cost of keeping replicas in sync can be significant. Measuring that cost gives us a way to observe how well the infrastructure is coping, especially during IO-intensive operations like index maintenance or data imports.<\/p>\n\n\n\n<p>Used over time, this technique can help to explain unexpected slowdowns, validate assumptions about AlwaysOn performance, and provide a solid basis for scheduling background tasks more safely. It\u2019s also a gentle reminder that a \u201chealthy\u201d secondary replica isn\u2019t just one that\u2019s connected \u2014 it\u2019s one that\u2019s keeping up.<\/p>\n\n\n\n<p>This kind of monitoring doesn\u2019t just help DBAs troubleshoot issues after the fact; it can inform operational planning, change management, and the safe deployment of maintenance routines. Replication performance is part of system health, and this gives us a practical way to track it.<\/p>\n\n\n\n<section id=\"faq\" class=\"faq-block my-5xl\">\n    <h2>FAQs: How to measure replication latency in SQL Server AlwaysOn<\/h2>\n\n                        <h3 class=\"mt-4xl\">1. How do you check replication lag in SQL Server AlwaysOn?<\/h3>\n            <div class=\"faq-answer\">\n                <p>For asynchronous replicas, use the AlwaysOn dashboard in SSMS or query the sys.dm_hadr_database_replica_states DMV to see the log_send_queue_size and redo_queue_size. For synchronous replicas, standard DMVs won\u2019t show meaningful lag. Instead, monitor the Mirrored Write Transactions\/sec and Transaction Delay performance counters, which reveal the per-transaction cost of keeping synchronous replicas in sync.<\/p>\n            <\/div>\n                    <h3 class=\"mt-4xl\">2. What causes HADR_SYNC_COMMIT waits in SQL Server?<\/h3>\n            <div class=\"faq-answer\">\n                <p>HADR_SYNC_COMMIT waits occur when the primary replica is waiting for the synchronous secondary to acknowledge that a transaction\u2019s log records have been hardened to disk. High wait times typically indicate I\/O bottlenecks on the secondary, network latency between replicas, or heavy concurrent workloads like index rebuilds overwhelming the secondary\u2019s write throughput.<\/p>\n            <\/div>\n                    <h3 class=\"mt-4xl\">3. Does synchronous replication in SQL Server AlwaysOn guarantee zero latency?<\/h3>\n            <div class=\"faq-answer\">\n                <p>No. Synchronous replication guarantees zero data loss (no committed transactions are lost on failover), but it does not guarantee zero delay. Every transaction on the primary must wait for the secondary to acknowledge receipt before committing. Under heavy I\/O load, this delay can reach tens of milliseconds, adding up significantly over thousands of transactions.<\/p>\n            <\/div>\n            <\/section>\n\n\n\n<section id=\"my-first-block-block_3d9c8c4fb0fcc499443e363ab60b2ee7\" class=\"my-first-block alignwide\">\n    <div class=\"bg-brand-600 text-base-white py-5xl px-4xl rounded-sm bg-gradient-to-r from-brand-600 to-brand-500 red\">\n        <div class=\"gap-4xl items-start md:items-center flex flex-col md:flex-row justify-between\">\n            <div class=\"flex-1 col-span-10 lg:col-span-7\">\n                <h3 class=\"mt-0 font-display mb-2 text-display-sm\">Simple Talk is brought to you by Redgate Software<\/h3>\n                <div class=\"child:last-of-type:mb-0\">\n                                            Take control of your databases with the trusted Database DevOps solutions provider. Automate with confidence, scale securely, and unlock growth through AI.                                    <\/div>\n            <\/div>\n                                            <a href=\"https:\/\/www.red-gate.com\/solutions\/overview\/\" class=\"btn btn--secondary btn--lg\" aria-label=\"Discover how Redgate can help you: Simple Talk is brought to you by Redgate Software\">Discover how Redgate can help you<\/a>\n                    <\/div>\n    <\/div>\n<\/section>","protected":false},"excerpt":{"rendered":"<p>Learn how to measure synchronous replication latency in SQL Server AlwaysOn Availability Groups using performance counters. Track HADR_SYNC_COMMIT waits and Transaction Delay during IO-intensive operations.&hellip;<\/p>\n","protected":false},"author":344195,"featured_media":107431,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[143523,143524],"tags":[159356,4292,4168,4170,159358,159357,159355,4150,4151,159359,4252],"coauthors":[159137],"class_list":["post-107414","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-databases","category-sql-server","tag-alwayson-availability-groups","tag-asynchronous","tag-database","tag-database-administration","tag-highly-available-database-systems","tag-how-to-2","tag-latency","tag-sql","tag-sql-server","tag-synchronous","tag-t-sql-programming"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/107414","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/344195"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=107414"}],"version-history":[{"count":10,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/107414\/revisions"}],"predecessor-version":[{"id":109051,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/107414\/revisions\/109051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media\/107431"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=107414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=107414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=107414"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=107414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}