{"id":1623,"date":"2014-01-16T13:00:00","date_gmt":"2014-01-16T21:00:00","guid":{"rendered":""},"modified":"2024-01-22T22:49:04","modified_gmt":"2024-01-23T06:49:04","slug":"storage-allocation-and-management-for-memory-optimized-tables","status":"publish","type":"post","link":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/","title":{"rendered":"Storage Allocation and Management for Memory-Optimized Tables"},"content":{"rendered":"<p>As described in <a href=\"http:\/\/blogs.technet.com\/b\/dataplatforminsider\/archive\/2013\/10\/11\/in-memory-oltp-how-durability-is-achieved-for-memory-optimized-tables.aspx\">implementing durability for memory optimized tables<\/a>, the storage requirements and its management for memory optimized tables is very different compared to the disk-based tables. If you are migrating a subset of your disk-based tables to memory-optimized tables or are just developing a new application with memory-optimized tables, you will notice these differences. Unlike disk-based tables in SQL Server that use 8k pages to store data in the same format both on disk and in memory, the \u00a0memory-optimized tables utilize a different size and\u00a0 format both in-memory and on disk. This has been a point of concern by many customers as they have observed, sometimes, disproportionate storage consumed by memory optimized tables. The goal of this blog is to help alleviate this confusion by describing how storage is managed over the lifetime of data rows.\u00a0<\/p>\n<p>The data for memory optimized tables is stored in one or more data\/delta file pairs (also referred to as checkpoint file pairs or CFP) with data file(s) storing inserted rows and delta file(s) referencing deleted rows. \u00a0During the execution of an OLTP workload, as the DML operations update, insert, and delete rows, new data\/delta files are created to persist the data. Also, existing delta files are updated to process delete of existing rows. \u00a0Over time, if the number of active rows, after accounting for deleted rows, in two or more consecutive CFPs falls below a threshold (usually &lt; 50%) such that they can be merged into one CFP of 128 MB, they are merged automatically by a background merge process into a new CFP. \u00a0Once the merge operation is complete, the older CFPs go through a transition phase and are eventually removed (i.e. garbage collected) from the storage. \u00a0Note, SQL Server 2014 CTP2 supports up to 4096 CFPs within a database but this limit will be changed to 8192 CFPs in RTM<\/p>\n<p>At any given time, the data\/delta file pairs are in one of the following 4 categories<\/p>\n<ol>\n<li>\n<span style=\"text-decoration:underline;\">Pre-allocated CFPs (data and delta):<\/span> A small set of CFPs are <i>kept<\/i> pre-allocated to minimize or eliminate any waits to allocate new files as transactions are being executed. These are full sized with data file size of 128MB and delta file size of 8MB but contain no data. The number of CFPs is computed as the number of logical processors or schedulers with a minimum of 8. This is a fixed storage overhead in databases with memory-optimized tables<\/li>\n<li>\n<span style=\"text-decoration:underline;\">Active CFPs<\/span>: These contain the inserted\/deleted rows for the last \u2018durable\u2019 checkpoint. These CFPs contain all inserted\/deleted rows required before applying the active part of the transaction log at the database restart. We expect that the combined size of the ACTIVE CFPs to be at most 2x of the in-memory size of memory-optimized tables. However, there are cases, specifically with data files &gt; 128MB which can happen due to large concurrent transactions or if the merge operation falls behind, when we may exceed this 2x limit. To simplify the discussion here, let us just assume all data files are 128MB and that the merge\/checkpoint operations are keeping up.<\/li>\n<li>\n<span style=\"text-decoration:underline;\">CFPs required for Operational Correctness<\/span>: These represents files that were a source of MERGE operations where rows from these files were moved to a new data\/delta files. These files (i.e. CFPs) are not needed for database restart.\u00a0 However, these CFPs can\u2019t be de-allocated or marked for deallocation (i.e. \u00a0Garbage collection) because they are needed if SQL Server needs to recover from a previous durable checkpoint. \u00a0A CFP can be marked for garbage collection once the log truncation point moves beyond its transaction range. This requires a combination of checkpoint operation and transaction log backups. <span style=\"text-decoration:underline;\">Transaction log backups are not needed if the database has been configured in simple recovery model.<\/span>\n<\/li>\n<li>\n<span style=\"text-decoration:underline;\">CFPs that can be removed from storage:<\/span> These are garbage collected similar to how file-stream files are garbage collected. \u00a0Please refer to <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/gg492195.aspx\">FS Garbage Collection<\/a> for details<\/li>\n<\/ol>\n<p>Transitioning CFPs out of category-3 and category-4 can take up to 5 checkpoints and transaction log backup steps, if not running in simple recovery mode. For in-memory databases, the automatic checkpoint is taken when the size of transaction log exceeds 512MB since the last checkpoint.\u00a0 You can, of course, manually force the checkpoint followed by log backup to expedite the garbage collection but then this will add 5 empty CFPs (i.e. 5 data\/delta file pairs with data file of size 128MB each). Typically, in test environment, you may have to force transaction log backups and checkpoints to remove the CFPs that are not needed. In production scenarios, however, we don\u2019t expect customers to do manual checkpoint but to rely on the automatic checkpoints and log backups that are taken as part of backup strategy. The impact of this garbage collection process is that in-memory databases may have a disproportionate storage footprint compared to its size in memory.<\/p>\n<p>To clarify the point further, let us walk through some examples of in-memory databases under various scenarios and compare their size in-memory and on storage.\u00a0 For these examples, we will assume we are running a SQL instance with 8 logical processor with 1 memory optimized table with following schema. Note, this has a row size of approximately 8KB.\u00a0<\/p>\n<p><span style=\"font-family:'courier new', courier;\"><span style=\"color:#0000ff;\">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:#0000ff;\">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:#0000ff;\">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:#0000ff;\">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:#0000ff;\">CONSTRAINT<\/span> [pk_t_memopt_c1] P<span style=\"color:#0000ff;\">RIMARY KEY NONCLUSTERED HASH<\/span> (c1) <span style=\"color:#0000ff;\">WITH<\/span><\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (<span style=\"color:#0000ff;\">BUCKET_COUNT<\/span> = 100000)<\/span><\/p>\n<p><span style=\"font-family:'courier new', courier;\">) <span style=\"color:#0000ff;\">WITH<\/span> (<span style=\"color:#0000ff;\">MEMORY_OPTIMIZED<\/span> = <span style=\"color:#0000ff;\">ON<\/span>, <span style=\"color:#0000ff;\">DURABILITY<\/span> = SCHEMA_AND_DATA)<\/span><\/p>\n<p>As indicated earlier, the fixed storage overhead for this configuration will be 1 GB (i.e. 8 data files of 128MB each).<\/p>\n<ul>\n<li>\n<b>Example-1:<\/b>  <\/p>\n<ul>\n<li>\n<i>DML Operation:<\/i> Insert 1 row<\/li>\n<li>\n<i>In-memory Size<\/i> &#8211; you can get the size by querying <span style=\"font-family:'courier new', courier;\"><span style=\"color:#339966;\">sys<\/span>.dm_db_xtp_table_memory_stats<\/span>. The data row is taking 8KB while hash index is taking 1MB for allocating 100K buckets<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"margin-left:60px;\"><span style=\"font-family:'courier new', courier;\">Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memory_used_by_indexes_kb memory_used_by_table_kb<\/span><\/p>\n<p style=\"margin-left:60px;\"><span style=\"font-family:'courier new', courier;\">&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><\/p>\n<p style=\"margin-left:60px;\"><span style=\"font-family:'courier new', courier;\">t1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1024\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8<\/span><\/p>\n<ul>\n<li style=\"list-style-type:none;\">\n<ul>\n<li>\n<i>Storage for memory-optimized table<\/i> \u2013 The storage is more interesting. On the machine with 8 logical processors, there are 8 data and 8 delta files pre-allocated and there is 1 data\/delta file pair used to store the currently active rows. So overall storage for memory optimized FG is (9*128MB) = 1.12 GB which is disproportionately larger than the size of in-memory table. This is expected because my configuration has a fixed overhead of 1 GB plus the granularity of storage allocation is 128MB. This is different than disk-based tables where unit of storage allocation is an 8K page for tables &lt; 64k in size. This additional size of storage for memory-optimized tables may surprise you if you are just playing with small data sets. However, we don\u2019t expect this to be a cause of concern as typical customer workload will have much larger dataset (e.g. 10s or 100s of GB) stored in memory-optimized tables.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<b>Example-2<\/b>  <\/p>\n<ul>\n<li>\n<i>Operation<\/i>: Insert 1-million rows<\/li>\n<li>\n<i>In-memory Size<\/i> \u2013 7.8GB<\/li>\n<li>\n<i>Storage for memory-optimized table <\/i>\u2013 8.9GB which is pretty reasonable compared to previous example. 1 million rows should take approx. 8GB of storage plus 1GB of fixed overhead which is now around 10%.<\/li>\n<li>\n<i>Storage for disk-based table<\/i> \u2013 it is around 8GB so it is of the same order as memory optimized tables.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<b>Example-3<\/b>  <\/p>\n<ul>\n<li>\n<i>Operation:<\/i> update non-key values for the first 500K rows of the table loaded in the previous example.<\/li>\n<li>\n<i>In-memory Size (used)<\/i> \u2013 8 GB. When I measured this, most rows had been garbage collected<\/li>\n<li>\n<i>Storage for memory-optimized table<\/i> \u2013 13 GB. You may wonder why the size of storage has gone up for update operation. \u00a0An update operation on memory-optimized table is done as delete followed by an insert.\u00a0 For the deleted rows, the delta file(s) are updated to reflect them and then the new row versions are inserted into another data file. So at this time, both old and new version of the data row are persisted and that is why you see that the storage consumption has gone up approximately 50%. The data\/delta files will get merged eventually and get garbage collected as described earlier.<\/li>\n<li>\n<i>Storage for disk-based tables<\/i> \u2013 it stays around 8GB. This is expected because the update of the non-key columns is done in-place for disk-based tables.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<b>Example-4<\/b>  <\/p>\n<ul>\n<li>\n<i>Workload\/Operations<\/i> \u2013 Update only OLTP workload running against a database of size 150GB for over 24 hours to measure storage and memory in the steady state<\/li>\n<li>\n<i>In-memory size (used)<\/i> \u2013 167 GB. This shows that the stale row versions are getting garbage collected. Please refer to <a href=\"http:\/\/blogs.technet.com\/b\/dataplatforminsider\/archive\/2013\/11\/14\/sql-server-2014-in-memory-oltp-memory-management-for-memory-optimized-tables.aspx\">Memory Management for Memory-Optimized Tables<\/a> for details.<\/li>\n<li>\n<i>Storage for memory-optimized table <\/i>\u2013320 GB. Given that the size of the database is 150GB, the storage in steady state is around 2.2 times.<\/li>\n<\/ul>\n<p style=\"padding:0;margin:0;\">\n<\/li>\n<\/ul>\n<p>Though these examples were over simplified but they do illustrate the difference in storage provisioning for memory optimized tables over disk-based tables. Your storage requirement will depend upon following key factors such<\/p>\n<ul>\n<li style=\"list-style-type:none;\">\n<ul>\n<li>size of your durable memory optimized tables<\/li>\n<li>DML operations on the durable tables. For example, if your workload is update heavy, it leads to MERGEs thereby inflating the storage requirement until these files get garbage collected<\/li>\n<li>Frequency of checkpoint and log backups.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>As described in implementing durability for memory optimized tables, the storage requirements and its management for memory optimized tables is very different compared to the disk-based tables. If you are migrating a subset of your disk-based tables to memory-optimized tables or are just developing a new application with memory-optimized tables, you will notice these differences.<\/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-1623","post","type-post","status-publish","format-standard","hentry","content-type-best-practices"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Storage Allocation and Management for 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:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Storage Allocation and Management for Memory-Optimized Tables - Microsoft SQL Server Blog\" \/>\n<meta property=\"og:description\" content=\"As described in implementing durability for memory optimized tables, the storage requirements and its management for memory optimized tables is very different compared to the disk-based tables. If you are migrating a subset of your disk-based tables to memory-optimized tables or are just developing a new application with memory-optimized tables, you will notice these differences.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-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-16T21:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-23T06:49:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/08\/cropped-microsoft_logo_element.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/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=\"6 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\"},\"author\":[{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/author\/sql-server-team\/\",\"@type\":\"Person\",\"@name\":\"SQL Server Team\"}],\"headline\":\"Storage Allocation and Management for Memory-Optimized Tables\",\"datePublished\":\"2014-01-16T21:00:00+00:00\",\"dateModified\":\"2024-01-23T06:49:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\"},\"wordCount\":1496,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\",\"name\":\"Storage Allocation and Management for Memory-Optimized Tables - Microsoft SQL Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#website\"},\"datePublished\":\"2014-01-16T21:00:00+00:00\",\"dateModified\":\"2024-01-23T06:49:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Storage Allocation and Management for Memory-Optimized Tables\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#website\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/\",\"name\":\"Microsoft SQL Server Blog\",\"description\":\"Official News from Microsoft\u2019s Information Platform\",\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cm-edgetun.pages.dev\/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:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization\",\"name\":\"Microsoft SQL Server Blog\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/cm-edgetun.pages.dev\/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:\/\/cm-edgetun.pages.dev\/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":"Storage Allocation and Management for 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:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/","og_locale":"en_US","og_type":"article","og_title":"Storage Allocation and Management for Memory-Optimized Tables - Microsoft SQL Server Blog","og_description":"As described in implementing durability for memory optimized tables, the storage requirements and its management for memory optimized tables is very different compared to the disk-based tables. If you are migrating a subset of your disk-based tables to memory-optimized tables or are just developing a new application with memory-optimized tables, you will notice these differences.","og_url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/","og_site_name":"Microsoft SQL Server Blog","article_publisher":"http:\/\/www.facebook.com\/sqlserver","article_published_time":"2014-01-16T21:00:00+00:00","article_modified_time":"2024-01-23T06:49:04+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/08\/cropped-microsoft_logo_element.png","type":"image\/png"}],"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":"6 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#article","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/"},"author":[{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/author\/sql-server-team\/","@type":"Person","@name":"SQL Server Team"}],"headline":"Storage Allocation and Management for Memory-Optimized Tables","datePublished":"2014-01-16T21:00:00+00:00","dateModified":"2024-01-23T06:49:04+00:00","mainEntityOfPage":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/"},"wordCount":1496,"commentCount":1,"publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/","name":"Storage Allocation and Management for Memory-Optimized Tables - Microsoft SQL Server Blog","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#website"},"datePublished":"2014-01-16T21:00:00+00:00","dateModified":"2024-01-23T06:49:04+00:00","breadcrumb":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/2014\/01\/16\/storage-allocation-and-management-for-memory-optimized-tables\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/"},{"@type":"ListItem","position":2,"name":"Storage Allocation and Management for Memory-Optimized Tables"}]},{"@type":"WebSite","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#website","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/","name":"Microsoft SQL Server Blog","description":"Official News from Microsoft\u2019s Information Platform","publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cm-edgetun.pages.dev\/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:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#organization","name":"Microsoft SQL Server Blog","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/cm-edgetun.pages.dev\/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:\/\/cm-edgetun.pages.dev\/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:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/users\/1457"}],"replies":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/comments?post=1623"}],"version-history":[{"count":0,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1623\/revisions"}],"wp:attachment":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/media?parent=1623"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/post_tag?post=1623"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/product?post=1623"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/content-type?post=1623"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/topic?post=1623"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/coauthors?post=1623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}