{"id":4899,"date":"2018-06-28T10:40:18","date_gmt":"2018-06-28T17:40:18","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/paul\/?p=4899"},"modified":"2018-06-28T10:47:53","modified_gmt":"2018-06-28T17:47:53","slug":"what-is-the-fcb_replica_sync-spinlock","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/","title":{"rendered":"What is the FCB_REPLICA_SYNC spinlock?"},"content":{"rendered":"<p style=\"text-align: justify;\">A question came up on the Data Platform MVP email list last night asking what the <em>FCB_REPLICA_SYNC<\/em> spinlock is. I answered the question and then promised to do a quick blog post, as there&#8217;s no information online about it that I could find.<\/p>\n<p style=\"text-align: justify;\"><strong>Explanation<\/strong><\/p>\n<p style=\"text-align: justify;\">In a nutshell, this spinlock is used to synchronize access to the list of pages that are present in a database snapshot, as follows:<\/p>\n<ul style=\"text-align: justify;\">\n<li>If a page in a database with one or more database snapshots is being updated, check each snapshot&#8217;s list to see if the page is already in the snapshot. If yes, nothing to do. If no, copy the pre-change image of the page into the snapshot.<\/li>\n<li>If a query is reading a page in the context of a database snapshot, check the list of pages to see whether to read from the snapshot or the source database.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">This synchronization ensures that the correct copy of a page is read by a query using the snapshot, and that updated pages aren&#8217;t copied to the snapshot more than once.<\/p>\n<p style=\"text-align: justify;\">The original question was because the person was seeing trillions of spins for the <em>FCB_REPLICA_SYNC<\/em> spinlock. That&#8217;s perfectly normal if there&#8217;s at least one database snapshot, a read workload on the snapshot, and a\u00a0concurrent heavy update workload on the source database.<\/p>\n<p style=\"text-align: justify;\"><strong>Example<\/strong><\/p>\n<p style=\"text-align: justify;\">For example, using our sample\u00a0<em>SalesDB<\/em> database (zip file <a href=\"https:\/\/www.sqlskills.com\/resources\/conferences\/salesdb2014.zip\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>), I created this query and set it running:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nWHILE (1=1)\r\nBEGIN\r\n    UPDATE &#x5B;SalesDB].&#x5B;dbo].&#x5B;Sales] SET &#x5B;Quantity] = &#x5B;Quantity] + 1;\r\nEND;\r\nGO\r\n<\/pre>\n<p style=\"text-align: justify;\">Then I took my script to capture spinlock metrics over a period of time (see <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/capturing-spinlock-statistics-for-a-period-of-time\/\" target=\"_blank\" rel=\"noopener noreferrer\">this post<\/a>), changed it to capture over 20 seconds, and then ran a <em>DBCC CHECKDB<\/em> on the\u00a0<em>SalesDB<\/em> database, which took 18 seconds.<\/p>\n<p>The spinlock metrics returned were:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSpinlock                  DiffCollisions DiffSpins  SpinsPerCollision DiffSleepTime DiffBackoffs\r\n------------------------- -------------- ---------  ----------------- ------------- ------------\r\nBUF_HASH                  2              500        250               0             0\r\nDBTABLE                   5              1250       250               0             0\r\nFCB_REPLICA_SYNC          5716270        1513329500 264               0             154380\r\nLOCK_HASH                 12             3500       291               0             1\r\nLOGCACHE_ACCESS           6              387        64                0             3\r\nLOGFLUSHQ                 4              75840      18960             0             3\r\nLOGPOOL_HASHBUCKET        15             3750       250               0             0\r\nLOGPOOL_SHAREDCACHEBUFFER 32             8000       250               0             0\r\nLSLIST                    8              2000       250               0             0\r\nSOS_SCHEDULER             3              1114       371               0             0\r\nSOS_TASK                  1              356        356               0             0\r\n<\/pre>\n<p>You can see that even for a 20-second test, a single <em>DBCC CHECKDB<\/em> produced 1.5 billion spins on the <em>FCB_REPLICA_SYNC<\/em> spinlock.<\/p>\n<p style=\"text-align: justify;\">This is perfectly normal.<\/p>\n<p style=\"text-align: justify;\">One of the dangers of looking at spinlock metrics is that the numbers involved can be so high that it&#8217;s easy to convince yourself that there&#8217;s some kind of problem, especially as there&#8217;s so little information available online about what the spinlocks actually mean. The vast majority of the time, there&#8217;s no problem, but it takes a lot of internals knowledge to know what&#8217;s going on.<\/p>\n<p style=\"text-align: justify;\">About the only thing I&#8217;d be concerned about is if there are multiple concurrent snapshots on a database with heavy update workload, as that will cause synchronous writes to all the snapshots when a page in the source database is first updated, slowing down the workload.<\/p>\n<p style=\"text-align: justify;\"><strong>Investigation<\/strong><\/p>\n<p style=\"text-align: justify;\">One thing you can always do if you&#8217;re interested in what a specific spinlock means is to investigate with Extended Events. There&#8217;s a whitepaper I helped review called\u00a0<em>Diagnosing and Resolving Spinlock Contention on SQL Server<\/em>\u00a0that you can download <a href=\"http:\/\/download.microsoft.com\/download\/d\/a\/a\/daad63af-b06f-4f29-af1d-68a78102abf4\/sqlserverspinlockcontention.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>. In it there&#8217;s an Extended Event session that I use to see where spinlocks backoffs occur.<\/p>\n<p style=\"text-align: justify;\">Here&#8217;s the session I used for\u00a0<em>FCB_REPLICA_SYNC<\/em> (which maps to the\u00a0<em>type<\/em> value of 136 in <em>sys.dm_xe_map_values<\/em>):<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\n-- Drop the session if it exists. \r\nIF EXISTS (SELECT * FROM sys.server_event_sessions WHERE &#x5B;name] = N'WatchSpinlocks')\r\n    DROP EVENT SESSION &#x5B;WatchSpinlocks] ON SERVER\r\nGO\r\n\r\nCREATE EVENT SESSION &#x5B;WatchSpinlocks] ON SERVER\r\nADD EVENT &#x5B;sqlos].&#x5B;spinlock_backoff]\r\n    (ACTION (&#x5B;package0].&#x5B;callstack])\r\n    WHERE &#x5B;type] = 136) -- FCB_REPLICA_SYNC only\r\nADD TARGET &#x5B;package0].&#x5B;asynchronous_bucketizer] (\r\n    SET filtering_event_name = N'sqlos.spinlock_backoff',\r\n    source_type = 1, -- source_type = 1 is an action\r\n    source = N'package0.callstack') -- bucketize on the callstack\r\nWITH (MAX_MEMORY = 50MB, MAX_DISPATCH_LATENCY = 5 seconds)\r\nGO\r\n\r\n-- Start the session\r\nALTER EVENT SESSION &#x5B;WatchSpinlocks] ON SERVER STATE = START;\r\nGO\r\n\r\n-- TF to allow call stack resolution\r\nDBCC TRACEON (3656, -1);\r\nGO\r\n\r\n-- Cause some spinlock backoffs\r\n\r\n-- Get the callstacks from the bucketizer target\r\nSELECT\r\n    &#x5B;event_session_address],\r\n    &#x5B;target_name],\r\n    &#x5B;execution_count],\r\n    CAST (&#x5B;target_data] AS XML)\r\nFROM sys.dm_xe_session_targets &#x5B;xst]\r\nINNER JOIN sys.dm_xe_sessions &#x5B;xs]\r\n    ON (&#x5B;xst].&#x5B;event_session_address] = &#x5B;xs].&#x5B;address])\r\nWHERE &#x5B;xs].&#x5B;name] = N'WatchSpinlocks';\r\nGO\r\n\r\n-- Stop the event session\r\nALTER EVENT SESSION &#x5B;WatchSpinlocks] ON SERVER\r\nSTATE = STOP;\r\nGO\r\n<\/pre>\n<p>You&#8217;ll need to download the debug symbols for the build you&#8217;re using &#8211; see <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/how-to-download-a-sqlservr-pdb-symbol-file\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a> for my instructions on how to do this.<\/p>\n<p>I started the\u00a0event session and re-ran the test. A sampling of the call stacks is below, with matching explanations.<\/p>\n<p>Explanation:<\/p>\n<ol>\n<li style=\"text-align: justify;\">Pushing a page into a snapshot just before it gets modified in the source database<\/li>\n<li style=\"text-align: justify;\">Reading a page from a snapshot (in this case, from one of <em>DBCC CHECKDB<\/em>&#8216;s parallel threads performing readahead)<\/li>\n<li style=\"text-align: justify;\">Pulling a page in to a snapshot while crash recovery is running on the new snapshot to make it a transactionally-consistent view of the source database (in this case, it&#8217;s a &#8216;transient&#8217; database snapshot that\u00a0<em>DBCC CHECKDB<\/em> has created)<\/li>\n<\/ol>\n<p>And plenty more similar call stacks.<\/p>\n<p>Call stack:<\/p>\n<ol>\n<li>XeSosPkg::spinlock_backoff::Publish+0x138<br \/>\nSpinlockBase::Sleep+0xc5<br \/>\nSpinlockBase::Backoff+0x145<br \/>\nSpinlock&amp;lt;136,4,1&amp;gt;::SpinToAcquireWithExponentialBackoff+0x169<br \/>\nFCBReplicaSync::StartWrite+0x7f<br \/>\nFCB::CopyPageToReplicas+0x212<br \/>\nBUF::CopyOnWrite+0x60<br \/>\nBPool::PrepareToDirty+0x180<br \/>\nIndexPageRef::Modify+0x146<br \/>\nBTreeRow::UpdateRecord+0x20ab<br \/>\nIndexDataSetSession::SetDataInternal+0x9a03<br \/>\nDatasetSession::SetData+0x16d<br \/>\nRowsetNewSS::SetData+0x6a<br \/>\nCValRow::SetDataX+0x63<br \/>\nCEsExec::GeneralEval4+0xe7<br \/>\nCQScanUpdateNew::GetRow+0x24b<br \/>\nCQueryScan::GetRow+0x81<br \/>\nCXStmtQuery::ErsqExecuteQuery+0x5be<br \/>\nCXStmtDML::XretDMLExecute+0x31c<br \/>\nCXStmtDML::XretExecute+0xad<br \/>\nCMsqlExecContext::ExecuteStmts&amp;lt;0,1&amp;gt;+0x8bd<br \/>\nCMsqlExecContext::FExecute+0xa68<br \/>\nCSQLSource::Execute+0x86c<br \/>\nCStmtPrepQuery::XretPrepQueryExecute+0x464<\/li>\n<li>XeSosPkg::spinlock_backoff::Publish+0x138<br \/>\nSpinlockBase::Sleep+0xc5<br \/>\nSpinlock&amp;lt;136,4,1&amp;gt;::SpinToAcquireWithExponentialBackoff+0x169<br \/>\nFCBReplicaSync::StartRead+0x86<br \/>\nFCB::ScatterRead+0x1b3<br \/>\nRecoveryUnit::ScatterRead+0xa9<br \/>\nBPool::GetFromDisk+0x719<br \/>\nBPool::ReadAhead+0x7e<br \/>\nMultiObjectScanner::GetNextPageAndReadAhead+0x38e<br \/>\nMultiObjectScanner::GetNext+0x98<br \/>\nMultiObjectScanner::GetNextPageAndBatch+0x2fc<br \/>\nCheckTables::ProcessNextData+0x1bb<br \/>\nCheckAggregateSingleInstance::GetNextFact+0x28e<br \/>\nCTRowsetInstance::FGetNextRow+0x3c<br \/>\nCUtRowset::GetNextRows+0xa0<br \/>\nCQScanRmtScanNew::GetRowHelper+0x3b8<br \/>\nCQScanXProducerNew::GetRowHelper+0x53<br \/>\nCQScanXProducerNew::GetRow+0x15<br \/>\nFnProducerOpen+0x57<br \/>\nFnProducerThread+0x8c3<br \/>\nSubprocEntrypoint+0xa7f<br \/>\nSOS_Task::Param::Execute+0x21e<br \/>\nSOS_Scheduler::RunTask+0xab<br \/>\nSOS_Scheduler::ProcessTasks+0x279<\/li>\n<li>XeSosPkg::spinlock_backoff::Publish+0x138<br \/>\nSpinlockBase::Sleep+0xc5<br \/>\nSpinlock&amp;lt;136,4,1&amp;gt;::SpinToAcquireWithExponentialBackoff+0x169<br \/>\nFCBReplicaSync::StartWrite+0x7f<br \/>\nFCB::PullPageToReplica+0x35<br \/>\nFCB::CopyPageToReplicas+0x12c<br \/>\nBUF::CopyOnWrite+0x60<br \/>\nBPool::PrepareToDirty+0x180<br \/>\nPageRef::ModifyRow+0x24a<br \/>\nIndexPageRef::Modify+0x19f2<br \/>\nBTreeRow::UpdateRecord+0x20ab<br \/>\nIndexDataSetSession::UndoSetData+0x4d9<br \/>\nXdesRMReadWrite::IndexModify+0x61<br \/>\nXdesRMReadWrite::UndoPageOperation+0x10da<br \/>\nXdesRMReadWrite::RollbackToLsn+0x7d6<br \/>\nRecoveryMgr::UndoRegularXacts+0xb09<br \/>\nRecoveryMgr::RollbackRemaining+0x137<br \/>\nRecoveryUnit::DoRollbackRecovery+0x19<br \/>\nRecoveryUnit::CompleteRecovery+0x6b8<br \/>\nRecoveryUnit::PhaseStart+0x87<br \/>\nDBTABLE::StartupPostRecovery+0x4d<br \/>\nDBTABLE::ReplicaCreateStartup+0x284<br \/>\nDBMgr::SyncAndLinkReplicaRecoveryPhase+0x787<br \/>\nDBMgr::CreatePhasedTransientReplica+0x717<\/li>\n<\/ol>\n<p><strong>Summary<\/strong><\/p>\n<p style=\"text-align: justify;\">So there you have it. The <em>FCB_REPLICA_SYNC<\/em> spinlock is to do with database snapshot reads and writes, and high numbers around it are expected with concurrent updates in the source database and reads in the snapshot.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A question came up on the Data Platform MVP email list last night asking what the FCB_REPLICA_SYNC spinlock is. I answered the question and then promised to do a quick blog post, as there&#8217;s no information online about it that I could find. Explanation In a nutshell, this spinlock is used to synchronize access to [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,39,48,66,84],"tags":[],"class_list":["post-4899","post","type-post","status-publish","format-standard","hentry","category-database-snapshots","category-extended-events","category-inside-the-storage-engine","category-performance-tuning","category-spinlocks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal<\/title>\n<meta name=\"description\" content=\"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.\" \/>\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\/paul\/what-is-the-fcb_replica_sync-spinlock\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-28T17:40:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-06-28T17:47:53+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/\",\"name\":\"What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2018-06-28T17:40:18+00:00\",\"dateModified\":\"2018-06-28T17:47:53+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"description\":\"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What is the FCB_REPLICA_SYNC spinlock?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?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\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal","description":"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.","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\/paul\/what-is-the-fcb_replica_sync-spinlock\/","og_locale":"en_US","og_type":"article","og_title":"What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal","og_description":"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/","og_site_name":"Paul S. Randal","article_published_time":"2018-06-28T17:40:18+00:00","article_modified_time":"2018-06-28T17:47:53+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/","name":"What is the FCB_REPLICA_SYNC spinlock? - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2018-06-28T17:40:18+00:00","dateModified":"2018-06-28T17:47:53+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"description":"This page explains the FCB_REPLICA_SYNC spinlock in SQL Server.","breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/what-is-the-fcb_replica_sync-spinlock\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"What is the FCB_REPLICA_SYNC spinlock?"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?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\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4899","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=4899"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4899\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=4899"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=4899"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=4899"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}