{"id":3706,"date":"2014-04-17T15:30:40","date_gmt":"2014-04-17T13:30:40","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/"},"modified":"2014-04-17T15:30:40","modified_gmt":"2014-04-17T13:30:40","slug":"in-memory-tables-bw-tree-and-storage","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/","title":{"rendered":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage"},"content":{"rendered":"<p>SQL Server 2014 introduces hash indexes with in-memory optimized tables. I described some of their aspects in a <a href=\"\/sql-server-2014-hekaton-memory-optimized-tables-hash-indexes-and-bucket-counts\" target=\"_blank\" rel=\"noopener noreferrer\">previous blog post<\/a>.\u00a0 These indexes are very efficient with lookup search operations but have some limitations with operations like range scans, inequality predicates or scan order operations. These limitations are linked to hash index design that stores rows in the index in a random order. Fortunately, nonclustered indexes for in-memory optimized tables (aka range indexes or Bw-Tree) solve this issue and, like hash indexes, involve a data row chain at their own structure in the leaf level.<br \/>\nIn this blog post I would like to share with you an interesting consideration about the Bw-Tree storage. Like a traditional b-tree index structure, accessing in-memory table data rows themselves requires first to go through the Bw-Tree structure prior to retrieve the corresponding row data in the chain. At the leaf level of the Bw-Tree we have different pointers to the first concerned data in the row chain. Pages in the index are linked together by logical pointers (called page identifiers or PID). This PID is then translated to a physical address or a flash offset of a page in memory or to a stable media storage. The Bw-Tree layer interacts with the cache layer that abstracts physical page by using a mapping table that maps logical pages to physical pages. Beside, others non-leaf pages in the Bw-Tree structure use the same mechanism. Here a simplified schema for retrieving the data through the Bw-Tree structure :<\/p>\n<p>Bw-Tree &#8211;&gt; Mapping Table &#8211;&gt; Physical Page<\/p>\n<p>Abstracting the physical layer has some advantages. Indeed, changing the physical location of a page requires only to change to corresponding mapping to the mapping table. The Bw-Tree path will not be affected by this change because each page is logical with their own PID.<\/p>\n<p>Now let\u2019s demonstrate an interesting behaviour of Bw-Tree (range indexes) with several extreme tests. We create an in-memory optimized table named hekaton_table with the following definition:<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">CREATE<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: blue\">TABLE <span style=\"color: teal\">dbo<span style=\"color: gray\">.<span style=\"color: teal\">hekaton_table<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">(<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">id <span style=\"color: blue\">INT <span style=\"color: gray\">NOT <span style=\"color: gray\">NULL <span style=\"color: blue\">PRIMARY <span style=\"color: blue\">KEY <span style=\"color: teal\">NONCLUSERED <span style=\"color: blue\">HASH <span style=\"color: blue\">WITH <span style=\"color: gray\">( <span style=\"color: teal\">BUCKET_COUNT <span style=\"color: gray\">= 1048576 <span style=\"color: gray\">),<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">col1 <span style=\"color: blue\">CHAR<span style=\"color: gray\">(100<span style=\"color: gray\">) <span style=\"color: fuchsia\">COLLATE <span style=\"color: teal\">French_BIN2 <span style=\"color: gray\">NOT <span style=\"color: gray\">NULL,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">INDEX <span style=\"color: teal\">idx_hekaton_table_col1 <span style=\"color: blue\">NONCLUSTERED <span style=\"color: gray\">( <span style=\"color: teal\">col1 <span style=\"color: gray\">)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">)<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">WITH<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">(<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">MEMORY_OPTIMIZED <span style=\"color: gray\">= <span style=\"color: blue\">ON<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">DURABILITY <span style=\"color: gray\">= <span style=\"color: teal\">SCHEMA_AND_DATA<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">)<\/span><\/div>\n<p>&nbsp;<\/p>\n<p>This table contains a hash index as a primary key on the id column and a nonclustered range index idx_hekaton_table_col1 that concerns the col1 column. We will use the DMVs <em>sys.dm_db_xtp_nonclustered_index_stats<\/em>, <em>sys.dm_db_xtp_memory_consumers<\/em> and <em>sys.dm_db_xtp_xtp_memory_stats<\/em> during the test.<\/p>\n<p>The first DMV <em>sys.dm_db_xtp_nonclustered_index_stats<\/em> includes statistics about operations on nonclustered indexes in memory-optimized tables.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">select<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">o<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: blue\">as <span style=\"color: teal\">table_name<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: blue\">as <span style=\"color: teal\">index_name<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"font-size: 9.5pt;font-family: Consolas;color: teal\">nis<span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">.<span style=\"font-size: 9.5pt;font-family: Consolas;color: teal\">internal_pages<span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">nis<span style=\"color: gray\">.<span style=\"color: teal\">delta_pages<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"font-size: 9.5pt;font-family: Consolas;color: teal\">nis<span style=\"font-size: 9.5pt;font-family: Consolas;color: gray\">.<span style=\"font-size: 9.5pt;font-family: Consolas;color: teal\">leaf_pages<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">from<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: teal\">dm_db_xtp_nonclustered_index_stats <span style=\"color: blue\">as <span style=\"color: teal\">nis<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: gray\">join <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">objects <span style=\"color: blue\">as <span style=\"color: teal\">o<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">on <span style=\"color: teal\">o<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id <span style=\"color: gray\">= <span style=\"color: teal\">nis<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: gray\">join <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">indexes <span style=\"color: blue\">as <span style=\"color: teal\">i<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">on <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id <span style=\"color: gray\">= <span style=\"color: teal\">nis<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: gray\">and <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">index_id <span style=\"color: gray\">= <span style=\"color: teal\">nis<span style=\"color: gray\">.<span style=\"color: teal\">index_id<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">where<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: gray\">= <span style=\"color: red\">&#8216;idx_hekaton_table_col1&#8217;<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats\" width=\"475\" height=\"40\" \/><\/p>\n<p>The second DMV <em>sys.dm_db_xtp_memory_consumers<\/em> provides useful information about the memory consumers. We are concerned by the Range index heap consumer for this example.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">select<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">o<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: blue\">as <span style=\"color: teal\">table_name<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: blue\">as <span style=\"color: teal\">index_name<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">xmc<span style=\"color: gray\">.<span style=\"color: teal\">memory_consumer_desc<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">xmc<span style=\"color: gray\">.<span style=\"color: teal\">allocated_bytes <span style=\"color: gray\">\/ 1024 <span style=\"color: blue\">as <span style=\"color: teal\">allocated_kb<span style=\"color: gray\">,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: teal\">xmc<span style=\"color: gray\">.<span style=\"color: teal\">used_bytes<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">from<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: teal\">dm_db_xtp_memory_consumers <span style=\"color: blue\">as <span style=\"color: teal\">xmc <\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: gray\">join <span style=\"color: green\">sys<span style=\"color: gray\">.<span style=\"color: green\">indexes <span style=\"color: blue\">as <span style=\"color: teal\">i<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">on <span style=\"color: teal\">xmc<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id <span style=\"color: gray\">= <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: fuchsia\">object_id<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: gray\">and <span style=\"color: teal\">xmc<span style=\"color: gray\">.<span style=\"color: teal\">index_id <span style=\"color: gray\">= <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">index_id<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">where<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">i<span style=\"color: gray\">.<span style=\"color: teal\">name <span style=\"color: gray\">= <span style=\"color: red\">&#8216;idx_hekaton_table_col1&#8217;<span style=\"color: gray\">; <\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_2.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_2\" width=\"537\" height=\"42\" \/><\/p>\n<p>The third DMV <em>sys.dm_db_xtp_table_memory_stats<\/em> provides information about the size of an in-memory table into the memory.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #bfbfbf\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">select<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #bfbfbf\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memory_used_by_table_kb<span style=\"color: gray\">,<\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #bfbfbf\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memory_used_by_indexes_kb<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #bfbfbf\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">from<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: green\">sys<span style=\"color: gray\">.dm_db_xtp_table_memory_stats<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #bfbfbf\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">where<span style=\"font-size: 9.5pt;font-family: Consolas\"> [object_id] <span style=\"color: gray\">= <span style=\"color: fuchsia\">object_id<span style=\"color: gray\">(<span style=\"color: red\">&#8216;hekaton_table&#8217;<span style=\"color: gray\">)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<p>&nbsp;<\/p>\n<p>For the first test we will introduce 200K rows of data in the col1 column with a high cardinality. All rows will have a distinct value.<\/p>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">declare<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">@i <span style=\"color: blue\">int <span style=\"color: gray\">= 1<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">while<span style=\"font-size: 9.5pt;font-family: Consolas\"> <span style=\"color: teal\">@i <span style=\"font-size: 9.5pt;line-height: 107%;font-family: Consolas;color: gray\"> 200000<\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">begin<\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">insert <span style=\"color: teal\">dbo<span style=\"color: gray\">.<span style=\"color: teal\">hekaton_table <span style=\"color: blue\">values <span style=\"color: gray\">(<span style=\"color: teal\">@i<span style=\"color: gray\">, <span style=\"color: red\">&#8216;t_&#8217; <span style=\"color: gray\">+ <span style=\"color: fuchsia\">cast<span style=\"color: gray\">(<span style=\"color: teal\">@i <span style=\"color: blue\">as <span style=\"color: blue\">varchar<span style=\"color: gray\">(10<span style=\"color: gray\">)));<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: blue\">set <span style=\"color: teal\">@i <span style=\"color: gray\">+= 1<span style=\"color: gray\">;<\/span><\/span><\/span><\/span><\/span><\/div>\n<div style=\"margin-bottom: 0.0001pt;line-height: normal;background: none repeat scroll 0% 0% #d9d9d9\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue\">end<\/span><\/div>\n<p>&nbsp;<\/p>\n<p>Then we take a look to result of the all DMVs:<\/p>\n<ul>\n<li>sys.dm_db_xtp_nonclustered_index_stats<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_3.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_3\" width=\"478\" height=\"41\" \/><\/p>\n<ul>\n<li>sys.dm_db_xtp_memory_consumers<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_4.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_4\" width=\"533\" height=\"41\" \/><\/p>\n<ul>\n<li>sys.dm_db_xtp_xtp_memory_stats<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_table_kb_7.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_table_kb_7\" width=\"353\" height=\"40\" \/><\/p>\n<p>With the second test we will introduce the same number of data rows in the col1 column with a low cardinality. All rows will have the same value. Here the results of the second test:<\/p>\n<ul>\n<li>sys.dm_db_xtp_nonclustered_index_stats<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_5.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_5\" width=\"481\" height=\"40\" \/><\/p>\n<ul>\n<li>sys.dm_db_xtp_memory_consumers<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_6.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_nonclustered_index_stats_6\" width=\"534\" height=\"40\" \/><\/p>\n<ul>\n<li>sys.dm_db_xtp_xtp_memory_stats<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_table_kb_8.jpg\" alt=\"billet_6_-_sys_dm_db_xtp_table_kb_8\" width=\"353\" height=\"40\" \/><\/p>\n<p>Wow! Only one leaf pages with 400 bytes used during the second test versus 5363 pages allocated with 26485848 bytes during the first test. We retrieve the same total size for the in-memory data itself (29687 KB). What\u2019s the matter? In fact, there is a big difference between traditional nonclustered indexes and Bw-Tree. Indeed, unlike a traditional nonclustered indexes where there is a pointer per row regardless the uniqueness of the index key the Bw-Tree has only one pointer per unique index value thus change the amount of storage used. For a table stored in memory that\u2019s an interesting optimization\u00a0\ud83d\ude00<\/p>\n<p>How about the data inserted during the second test? : Rows with the same value are grouped in the same row chain as showed below :<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_nonclustered_range_index.jpg\" alt=\"billet_6_-_nonclustered_range_index\" width=\"558\" height=\"293\" \/><\/p>\n<p>The use of the sys.dm_db_xtp_nonclustered_index_stats DMV also introduces new pages concepts. I advice you the reading of the Microsoft research about <a href=\"http:\/\/research.microsoft.com\/pubs\/178758\/bw-tree-icde2013-final.pdf\">Bw-Tree<\/a> . As seen above there is two others pages type columns: the internal pages that represent the top level of the Bw-Tree (root and nonleaf pages in a classic B-Tree structure) and delta pages that are \u201cspecial pages\u201d that contains an operation code (insert, delete) and a memory value which is the memory address in the first row in a chain of records. These pages are part of a special mechanism that allow to incrementally update page state in a latch-free manner. Remember with in-memory tables locks and latchs does not exist anymore! I will prepare a future blog post dedicated to this interesting mechanism !<\/p>\n<p><span style=\"float: none;background-color: #ffffff;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;text-align: left;text-decoration: none;text-indent: 0px;text-transform: none\">By David Barbarin<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQL Server 2014 introduces hash indexes with in-memory optimized tables. I described some of their aspects in a previous blog post.\u00a0 These indexes are very efficient with lookup search operations but have some limitations with operations like range scans, inequality predicates or scan order operations. These limitations are linked to hash index design that stores [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":3707,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[198],"tags":[453,431,52],"type_dbi":[],"class_list":["post-3706","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-management","tag-bw-tree","tag-hekaton","tag-sql-server-2014"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL Server 2014: In-Memory tables, Bw-Tree, and storage - dbi 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.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server 2014: In-Memory tables, Bw-Tree, and storage\" \/>\n<meta property=\"og:description\" content=\"SQL Server 2014 introduces hash indexes with in-memory optimized tables. I described some of their aspects in a previous blog post.\u00a0 These indexes are very efficient with lookup search operations but have some limitations with operations like range scans, inequality predicates or scan order operations. These limitations are linked to hash index design that stores [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-04-17T13:30:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"475\" \/>\n\t<meta property=\"og:image:height\" content=\"40\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 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\/in-memory-tables-bw-tree-and-storage\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"SQL Server 2014: In-Memory tables, Bw-Tree, and storage\",\"datePublished\":\"2014-04-17T13:30:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\"},\"wordCount\":1052,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\",\"keywords\":[\"Bw-Tree\",\"hekaton\",\"SQL Server 2014\"],\"articleSection\":[\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\",\"name\":\"SQL Server 2014: In-Memory tables, Bw-Tree, and storage - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\",\"datePublished\":\"2014-04-17T13:30:40+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg\",\"width\":475,\"height\":40},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server 2014: In-Memory tables, Bw-Tree, and storage\"}]},{\"@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\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage - dbi 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.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage","og_description":"SQL Server 2014 introduces hash indexes with in-memory optimized tables. I described some of their aspects in a previous blog post.\u00a0 These indexes are very efficient with lookup search operations but have some limitations with operations like range scans, inequality predicates or scan order operations. These limitations are linked to hash index design that stores [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/","og_site_name":"dbi Blog","article_published_time":"2014-04-17T13:30:40+00:00","og_image":[{"width":475,"height":40,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage","datePublished":"2014-04-17T13:30:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/"},"wordCount":1052,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg","keywords":["Bw-Tree","hekaton","SQL Server 2014"],"articleSection":["Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/","url":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/","name":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg","datePublished":"2014-04-17T13:30:40+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/billet_6_-_sys_dm_db_xtp_nonclustered_index_stats.jpg","width":475,"height":40},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-tables-bw-tree-and-storage\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server 2014: In-Memory tables, Bw-Tree, and storage"}]},{"@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\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/3706","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\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=3706"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/3706\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/3707"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=3706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=3706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=3706"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=3706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}