{"id":1593,"date":"2014-01-23T12:45:00","date_gmt":"2014-01-23T20:45:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/dataplatforminsider\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/"},"modified":"2024-01-22T22:49:03","modified_gmt":"2024-01-23T06:49:03","slug":"state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/","title":{"rendered":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables"},"content":{"rendered":"<p>In the previous blog <a href=\"\/sqlserver\/2014\/01\/22\/merge-operation-in-memory-optimized-tables\/\">Merge Operations<\/a>, we described that how a CFP transitions across various stages in its life cycle. In this blog, we will walk through an actual example to show the state transition. Note, some of the states shown for CFPs are only visible in RTM bits (not in CTP2) but internally the state transitions is the same. Basing this example using RTM bits adds lot more clarity in how storage is managed. Another note is that RTM bits allocate CFPs (16MB of data file and 1 MB of delta file) on machines with physical memory &lt;= 16GB. This example was run on a machine with 8GB of RAM using pre-RTM bits.<\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">CREATE DATABASE<\/span> hkdb1 <span style=\"color:#3366ff;\">ON\u00a0<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0<span style=\"color:#3366ff;\">PRIMARY<\/span> (NAME = [hkdb1_hk_fs_data], <span style=\"color:#3366ff;\">FILENAME<\/span> = <span style=\"color:#ff0000;\">&#8216;C:\\hekaton_test\\data\\hkdb1_data.mdf&#8217;<\/span>),<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0<span style=\"color:#3366ff;\">FILEGROUP<\/span> [hkdb1_hk_fs_fg] <span style=\"color:#ff00ff;\">CONTAINS<\/span> MEMORY_OPTIMIZED_DATA<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0(NAME = [hkdb1_hk_fs_dir],\u00a0 <span style=\"color:#3366ff;\">FILENAME<\/span> = <span style=\"color:#ff0000;\">&#8216;C:\\hekaton_test\\data\\hkdb1_hk_fs_dir&#8217;<\/span>)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0<span style=\"color:#ff00ff;\">LOG<\/span> <span style=\"color:#3366ff;\">ON<\/span> (name = [hktest_log], <span style=\"color:#3366ff;\">Filename<\/span>=<span style=\"color:#ff0000;\">&#8216;C:\\hekaton_test\\data\\hkdb1_log.ldf&#8217;<\/span>, size=100MB)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; disable auto-merge so that we can show the merge<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; in a predictable way<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">dbcc<\/span> traceon (9851, -1)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; set the database to full recovery. This is a common practice for production scenario<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">alter database<\/span> hkdb1 <span style=\"color:#3366ff;\">set recovery full<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">use<\/span> hkdb1<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; create a memory-optimized table with each row of size &gt; 8KB<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">CREATE TABLE<\/span> dbo.t_memopt (<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c1 <span style=\"color:#3366ff;\">int<\/span> NOT NULL,<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c2 <span style=\"color:#3366ff;\">char<\/span>(40) NOT NULL,<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c3 <span style=\"color:#3366ff;\">char<\/span>(8000) NOT NULL,<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color:#3366ff;\">CONSTRAINT<\/span> [pk_t_memopt_c1] <span style=\"color:#3366ff;\">PRIMARY KEY NONCLUSTERED HASH<\/span> (c1) <span style=\"color:#3366ff;\">WITH<\/span> (<span style=\"color:#3366ff;\">BUCKET_COUNT<\/span> = 100000)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">) <span style=\"color:#3366ff;\">WITH<\/span> (<span style=\"color:#3366ff;\">MEMORY_OPTIMIZED<\/span> = <span style=\"color:#3366ff;\">ON<\/span>,<span style=\"color:#3366ff;\"> DURABILITY<\/span> = SCHEMA_AND_DATA)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; do the database backup. We do this so that we can do transaction log backups<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">BACKUP DATABASE<\/span> [hkdb1] <span style=\"color:#3366ff;\">TO\u00a0 DISK<\/span> = <span style=\"color:#ff0000;\">N&#8217;C:\\hekaton_test\\data\\hk-empty-data.bak&#8217;<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">WITH NOFORMAT<\/span>, <span style=\"color:#3366ff;\">INIT<\/span>,\u00a0 NAME = <span style=\"color:#ff0000;\">N&#8217;hkdb1-Full Database Backup&#8217;<\/span>, <span style=\"color:#3366ff;\">SKIP<\/span>, <span style=\"color:#3366ff;\">NOREWIND<\/span>, <span style=\"color:#3366ff;\">NOUNLOAD<\/span>,\u00a0 <span style=\"color:#339966;\">STATS<\/span> = 10<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">GO<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; load 8000 rows. This should load 5 16MB data files on a machine with &lt;= 16GB of storage<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">declare<\/span> @i <span style=\"color:#3366ff;\">int<\/span> = 0<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">while<\/span> (@i &lt; 8000)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">begin<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color:#3366ff;\">insert<\/span> t_memopt <span style=\"color:#3366ff;\">values<\/span> (@i, <span style=\"color:#ff0000;\">&#8216;a&#8217;<\/span>, <span style=\"color:#ff00ff;\">replicate<\/span> (<span style=\"color:#ff0000;\">&#8216;b&#8217;<\/span>, 8000))<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color:#3366ff;\">set<\/span> @i += 1;<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">end<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#3366ff;\">go<\/span><\/p>\n<p>In this example, we will show the output of DMV sys.dm_db_xtp_checkpoint_files using the following query.<\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">select<\/span> file_type_desc, state_desc, internal_storage_slot,file_size_in_bytes, file_size_used_in_bytes,<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">inserted_row_count, deleted_row_count, lower_bound_tsn, upper_bound_tsn, last_backup_page_count, drop_table_deleted_row_count\u00a0<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">from<\/span> <span style=\"color:#339966;\">sys<\/span>.dm_db_xtp_checkpoint_files<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#3366ff;\">order by<\/span> container_id, file_type_desc, upper_bound_tsn<\/span><\/p>\n<p>Here is the output after removing some columns and rows (just showing rows with DATA file).<\/p>\n<ul>\n<li>There are 8 data files under \u2018PRECREATED\u2019 state. This demo was run on machine with 4 logical processors with 8GB memory. The size of the files is 16MB (supported in SQL Server 2014 RTM on a machine with &lt;= 16GB memory)<\/li>\n<li>There are 5 data files marked \u2018UNDER CONSTRUCTION\u2019 as checkpoint has not been taken but these files together store 8000 rows that we had inserted. If database is restarted, the data rows will loaded using transaction log and NOT from these files as they are not part of a durable checkpoint<\/li>\n<\/ul>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/Output.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/Output.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>Now, execute a manual checkpoint by executing the following command and see the state transition in the CFPs. You will note that UNDER CONSTRUCTION CFPs are now marked ACTIVE as they are part of a durable checkpoint that we have just completed. The manual checkpoint closed the data file with internal_storage_slot though it was only 25% full. This data file can potentially be merged in future as it qualifies under the merge policy.<\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">checkpoint<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Execute20a20manual20checkpoint.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/Execute-a-manual-checkpoint.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Execute20a20manual20checkpoint.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/Execute-a-manual-checkpoint.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>Now, we will delete 50% rows<\/p>\n<p><span style=\"font-family:'courier new', courier;color:#339966;\">&#8212; now delete 50% rows<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">declare<\/span> @i <span style=\"color:#0000ff;\">int<\/span> = 0<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">while<\/span> (@i &lt;= 8000)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">begin<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color:#0000ff;\">delete<\/span> t_memopt <span style=\"color:#0000ff;\">where<\/span> c1 = @i<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color:#0000ff;\">set<\/span> @i += 2;<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">end<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">checkpoint<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p>Here is the output of the DMV for CFPs in ACTIVE state using the following query<\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">select<\/span> file_type_desc, state_desc, internal_storage_slot,file_size_in_bytes, file_size_used_in_bytes,<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">inserted_row_count, deleted_row_count, lower_bound_tsn, upper_bound_tsn, last_backup_page_count, drop_table_deleted_row_count\u00a0<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">from<\/span> <span style=\"color:#339966;\">sys<\/span>.dm_db_xtp_checkpoint_files<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">where state = 2<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">order by<\/span> container_id, file_type_desc, upper_bound_tsn<\/span><\/p>\n<p>Note that the delta files have reference to the deleted rows. There is a CFP with 0 data rows due to a manual checkpoint.<b><\/b><\/p>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFP20with20020data20rows.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFP-with-0-data-rows.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFP20with20020data20rows.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFP-with-0-data-rows.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>\u00a0For this example, we had disabled auto-merge so that we can see the state transitions with no surprises.<\/p>\n<p>We will now force a manual merge (merging all the ACTIVE CFPs) by executing the following command<\/p>\n<p><span style=\"font-family:'courier new', courier;\">&#8212; <span style=\"color:#339966;\">now do the manual merge<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">&#8212; <span style=\"color:#339966;\">it generates merge-target and other files stay as regular files<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">exec<\/span> <span style=\"color:#339966;\">sys<\/span>.sp_xtp_merge_checkpoint_files <span style=\"color:#ff0000;\">&#8216;hkdb1&#8217;<\/span>,\u00a0 1877, 12004<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p>The DMV shows that the merge was executed and there is new CFP marked as MERGE TARGET containing 4000 rows. Also, note the data file is around 33MB, much larger than 16MB. This happened because we forced the merge. The auto-merge would not have merged all ACTIVE CFPs because it won\u2019t meet the merge policy.<\/p>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/DMV20shows20that20merge20was20executed.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/DMV-shows-that-merge-was-executed.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/DMV20shows20that20merge20was20executed.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/DMV-shows-that-merge-was-executed.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>At this time, the CFPs that are sources of MERGE are still marked as ACTIVE. This is because the merge has not been installed. You can query the state of merge request as follows<\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">select<\/span> request_state_desc, lower_bound_tsn, upper_bound_tsn<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">from<\/span> <span style=\"color:#339966;\">sys<\/span>.dm_db_xtp_merge_requests<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">request_state_desc\u00a0\u00a0 lower_bound_tsn\u00a0\u00a0\u00a0\u00a0\u00a0 upper_bound_tsn<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">PENDING\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 12007<\/span><\/p>\n<p>\u00a0<\/p>\n<p>Now, we will force a checkpoint to install the merge.<\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">checkpoint<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p>Here is the output of the DMVs. It shows that the MERGE TARGET is now changed to ACTIVE state and all the CFPs that were used as source of the MERGE are now marked as MERGED SOURCE. Referring to the blog &lt;reference&gt;, these CFPs are now in category-3.\u00a0<\/p>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/output20of20DMVs.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/output-of-DMVs.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/output20of20DMVs.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/output-of-DMVs.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>The source CFPs will transition into category-4 automatically as automatic checkpoints and log backups are taken. For the example, here we will force the checkpoint and log backups as follows<\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">checkpoint<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">go<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">&#8212; <span style=\"color:#339966;\">do the log backup.<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">BACKUP<\/span> <span style=\"color:#ff00ff;\">LOG<\/span> [hkdb1] <span style=\"color:#0000ff;\">TO\u00a0 DISK<\/span> =<span style=\"color:#ff0000;\"> N&#8217;C:\\hekaton_test\\data\\hk-log-1.bak&#8217;<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">WITH NOFORMAT<\/span>, <span style=\"color:#0000ff;\">INIT<\/span>,\u00a0 NAME = <span style=\"color:#ff0000;\">N&#8217;hk-log Database Backup&#8217;<\/span>, <span style=\"color:#0000ff;\">SKIP<\/span>,<span style=\"color:#0000ff;\"> NOREWIND<\/span>, <span style=\"color:#0000ff;\">NOUNLOAD<\/span>,\u00a0 <span style=\"color:#339966;\">STATS<\/span> = 10<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;color:#0000ff;\">GO<\/span><\/p>\n<p>Here is the output of the DMV showing that earlier CFPs have now transitioned to state REQUIRED FOR BACKUP\/HA meaning that these CFPs can\u2019t be garbage collected as they are needed for operational correctness of the database with memory-optimized table<\/p>\n<p style=\"text-align:center;\">\u00a0<a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFPs20have20transitioned.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFPs-have-transitioned.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFPs20have20transitioned.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFPs-have-transitioned.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>After couple of manual checkpoint followed by log backup, the DMV output shows that CFPs are finally being handed off to the garbage collector for File Stream. At this stage, these CFPs are not needed for operational correctness for our database. To state differently, the full database backup of the database will NOT include these CFPs but they continue take storage space in the memory-optimized filegroup until they are garbage collected.<\/p>\n<p style=\"text-align:center;\"><a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/DMV20Output20shows20CFPs20are20handed20off20to20garbage20collector20for20File20Stream.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/DMV-Output-shows-CFPs-are-handed-off-to-garbage-collector-for-File-Stream.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/DMV20Output20shows20CFPs20are20handed20off20to20garbage20collector20for20File20Stream.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/DMV-Output-shows-CFPs-are-handed-off-to-garbage-collector-for-File-Stream.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>One more cycle of manual checkpoint followed by log backup, the CFPs are actually transitioned to TOMBSTONE state which indicates that these will get removed as part of File Stream Garbage Collection. Please refer to <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/gg492195.aspx\">FS Garbage Collection<\/a> for details<\/p>\n<p style=\"text-align:center;\">\u00a0<a href=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFPs20are20transitioned20to20TOMBSTONE20state.png\" original-url=\"http:\/\/blogs.technet.com\/cfs-file.ashx\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFPs-are-transitioned-to-TOMBSTONE-state.png\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/CFPs20are20transitioned20to20TOMBSTONE20state.png\" original-url=\"http:\/\/blogs.technet.com\/resized-image.ashx\/__size\/550x0\/__key\/communityserver-blogs-components-weblogfiles\/00-00-00-60-54\/CFPs-are-transitioned-to-TOMBSTONE-state.png\" border=\"0\" alt=\" \" srcset=\"\"><\/a><\/p>\n<p>This concludes the state transition of CFPs. The main point to remember is that it takes few checkpoint\/log-backups after a set of CFPs have been merged before the storage can be garbage collected. We expect these state transitions to occur automatically in production environment as checkpoints will occur automatically for each additional 512MB transaction log generation and the regular log backups that are taken as part of backup strategy. However, you will need to account for this extra storage as CFPs go through transition from MERGE SOURCE to finally getting garbage collected.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the previous blog Merge Operations, we described that how a CFP transitions across various stages in its life cycle. In this blog, we will walk through an actual example to show the state transition.<\/p>\n","protected":false},"author":1457,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","footnotes":""},"post_tag":[],"product":[],"content-type":[2424],"topic":[],"coauthors":[2487],"class_list":["post-1593","post","type-post","status-publish","format-standard","hentry","content-type-best-practices","review-flag-1593580427-503","review-flag-1593580410-819","review-flag-1593580419-556","review-flag-1-1593580431-15","review-flag-2-1593580436-981","review-flag-3-1593580441-293","review-flag-4-1593580446-456","review-flag-5-1593580452-31","review-flag-8-1593580467-480","review-flag-new-1593580247-437"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog<\/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.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog\" \/>\n<meta property=\"og:description\" content=\"In the previous blog Merge Operations, we described that how a CFP transitions across various stages in its life cycle. In this blog, we will walk through an actual example to show the state transition.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft SQL Server Blog\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/sqlserver\" \/>\n<meta property=\"article:published_time\" content=\"2014-01-23T20:45:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-23T06:49:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\" \/>\n<meta name=\"author\" content=\"SQL Server Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:site\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"SQL Server Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/\",\"@type\":\"Person\",\"@name\":\"SQL Server Team\"}],\"headline\":\"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables\",\"datePublished\":\"2014-01-23T20:45:00+00:00\",\"dateModified\":\"2024-01-23T06:49:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\"},\"wordCount\":1283,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\",\"name\":\"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\",\"datePublished\":\"2014-01-23T20:45:00+00:00\",\"dateModified\":\"2024-01-23T06:49:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"name\":\"Microsoft SQL Server Blog\",\"description\":\"Official News from Microsoft\u2019s Information Platform\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\",\"name\":\"Microsoft SQL Server Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"width\":259,\"height\":194,\"caption\":\"Microsoft SQL Server Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"http:\/\/www.facebook.com\/sqlserver\",\"https:\/\/x.com\/SQLServer\",\"https:\/\/www.youtube.com\/user\/MSCloudOS\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog","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.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/","og_locale":"en_US","og_type":"article","og_title":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog","og_description":"In the previous blog Merge Operations, we described that how a CFP transitions across various stages in its life cycle. In this blog, we will walk through an actual example to show the state transition.","og_url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/","og_site_name":"Microsoft SQL Server Blog","article_publisher":"http:\/\/www.facebook.com\/sqlserver","article_published_time":"2014-01-23T20:45:00+00:00","article_modified_time":"2024-01-23T06:49:03+00:00","og_image":[{"url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png","type":"","width":"","height":""}],"author":"SQL Server Team","twitter_card":"summary_large_image","twitter_creator":"@SQLServer","twitter_site":"@SQLServer","twitter_misc":{"Written by":"SQL Server Team","Est. reading time":"5 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/","@type":"Person","@name":"SQL Server Team"}],"headline":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables","datePublished":"2014-01-23T20:45:00+00:00","dateModified":"2024-01-23T06:49:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/"},"wordCount":1283,"commentCount":2,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/","name":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables - Microsoft SQL Server Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png","datePublished":"2014-01-23T20:45:00+00:00","dateModified":"2024-01-23T06:49:03+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#primaryimage","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/03\/Output.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2014\/01\/23\/state-transition-of-checkpoint-files-in-databases-with-memory-optimized-tables\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/"},{"@type":"ListItem","position":2,"name":"State Transition of Checkpoint Files in Databases with Memory-Optimized Tables"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","name":"Microsoft SQL Server Blog","description":"Official News from Microsoft\u2019s Information Platform","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization","name":"Microsoft SQL Server Blog","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","width":259,"height":194,"caption":"Microsoft SQL Server Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/"},"sameAs":["http:\/\/www.facebook.com\/sqlserver","https:\/\/x.com\/SQLServer","https:\/\/www.youtube.com\/user\/MSCloudOS"]}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/users\/1457"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/comments?post=1593"}],"version-history":[{"count":0,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1593\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/media?parent=1593"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/post_tag?post=1593"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/product?post=1593"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/content-type?post=1593"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/topic?post=1593"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/coauthors?post=1593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}