Blog Post

SQL Server Blog
13 MIN READ

1.0 Structure of the Plan Cache and Types of Cached Objects

sshekar's avatar
sshekar
Icon for Microsoft rankMicrosoft
Mar 23, 2019
First published on MSDN on Jan 09, 2007

<br/><!--<br/> table.MsoNormalTable<br/> {mso-style-parent:"";<br/> font-size:10.0pt;<br/> font-family:"Times New Roman";<br/> }<br/> p.MsoNormal<br/> {mso-style-parent:"";<br/> margin-bottom:.0001pt;<br/> font-size:12.0pt;<br/> font-family:"Times New Roman";<br/> margin-left:0in; margin-right:0in; margin-top:0in}<br/>--><br/>

The plan cache is comprised of 4 separate cache stores: Object Plans (CACHESTORE_OBJCP), SQL Plans (CACHESTORE_SQLCP), Bound Trees (CACHESTORE_PHDR), and Extended Stored Procedures (CACHESTORE_XPROC). Each of these four cache stores conform to a uniform caching policy with respect to costing and removal of entries. Within each cache store is a hash table that is divided into hash buckets. Each hash bucket may contain one or more cached entries. The hash value of all cache entries is computed as (object_id * database_id) mod (hash table size), and this specifies the hash bucket. A cache key is used to find an exact match for a plan in the cache store hash table bucket.



In the plan cache we cache the following types of objects: compiled plans (CP), execution plans (MXC), algebrizer trees (ProcHdr), Extended Procs (XProcs) and inactive cursors. Among these, compiled plans, algebrizer trees and extended procs are top level objects where as the execution plans and inactive cursors are dependant objects (dependant on the compiled plans). The section below describes each of these objects in greater detail including which of the four cache stores they reside in.



1.1 Types of Cached Objects



1.1.1 Compiled Plans (CP)



When a query is compiled, a compiled plan is generated for the query. The cost of compiling a query each time is large; therefore we cache the compiled plans. There are two cache stores in which compiled plans are stored depending on the type of the compiled plan. If the query is dynamic sql or prepared, the compiled plan is stored in the SQL Plans (CACHESTORE_SQLCP) cache store. For modules like stored procedures, functions and triggers, the compiled plan is stored in Object Plans (CACHESTORE_OBJCP) cache store. Since the compiled plans are valuable and should to be kept in cache, when the cache stores are under memory pressure, cache removal policies ensure that these entries are not amongst the first to be removed. Compiled plans are also shared across multiple users.



Compiled plans are generated for the entire batch, and not on a per statement (query) level. Therefore for a multi-statement batch, the compiled plan can be thought of as an array of plans containing the query plan for statements in that batch. It is important to understand that for a batch with multiple queries in it, the compiled plan will have the compiled query plans for all the queries in the batch.



Internally each individual statement in a batch is represented by a CStmt (short for Compiled Statement). Each CStmt has the query plan for that particular statement. A compiled plan therefore has an array of CStmts that are in turn stored in a plan skeleton. In addition to the plan skeleton, the compiled plan also contains the parameter collection, symbol table, the top level memory object and the execution plans.



Compiled Plans are non re-generatable entries since we can potentially get different compiled plans for queries compiled under different conditions or at different times. For consistency however, we want to keep the compiled plans in cache and re-execute the same plan to get the same behavior.



1.1.2 Execution Plans (MXC)



Execution plans are run time objects and are dependant objects of a compiled plan. They cannot exist independent of a compiled plan. Just like the compiled plans there are two types of MXCs: SQL MXC and OBJ MXC. Being dependant objects (of compiled plans) they don’t live a separate cachestore. The compiled plan has 2 linked lists for MXCs: a lookup (or free) list and an enum list. The lookup list stores the free (or currently not in use) MXCs. The lookup list is used to get the MXC memory needed to execute a batch. The enum list is used to enumerate all the MXCs associated with the compiled plan, and is used by some dynamic management views (DMVs) and to generate statistics like total memory used by a batch. MXCs themselves contain the runtime parameters, local variable information; object ids for objects created at run time, run time state like currently executing statement amongst other things.



During query execution, we generate an execution plan (MXC) from the compiled plan of the batch. Individual statement compiled plans get converted into to runtime query plans (XStmts). The XStmts are stored as a linked list inside the CStmts.



Unlike compiled plans, execution plans are single user. For example, if there are N users executing the same batch simultaneously, there will be N MXCs associated with the same compiled plan. There is therefore a 1:N mapping between compiled plans and execution plans.



MXCs are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.



1.1.3 Algebrizer Tree (ProcHdr)



The algerbizer tree (ProcHdr) for views, constraints and defaults are cached in the Bound Trees (CACHESTORE_PHDR) cache store. The size of the bound trees cache store hash table is about 1/10th the size of the compiled plan cache store hash tables. The memory object from which each entry is allocated is 8K memory object.



1.1.4 Extended Procs (XProc)



Extended Procs (Xprocs) are pre-defined system stored procedures like sp_ExecuteSql, sp_TraceCreate etc. They contain the function name and the DLL name of the implementation. They are stored in the Extended Stored Procedures (CACHESTORE_XPROC). The size of this cache store hash table is 127 entries. The memory object from which each entry is allocated is 256 bytes memory object.



1.1.5 Inactive Cursors



Inactive cursors are cached in the compiled plan. Just like MXCs there are two lists maintained here: the lookup list and the enum list. The lookup list stores the inactive cursors. When a cursor is de-allocated, the memory used to store the cursor is cached. On subsequent re-execution of the batch with this cursor, the cached cursor memory is reused and re-initialized as an active cursor. The enum list has the list of active and inactive cursors and is used to enumerate all cursors for a compiled plan.



Cursors are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.



1.2 Understanding Memory Layout of Compiled Plan using DMVs



For a detailed summary of the memory layout refer to this posting . In this section we will take a look at the DMVs and learn more about the memory layout of compiled plans through examples.



Sys.dm_exec_cached_plans has the plan_handle and the memory_object_address associated with every compiled plan. The plan_handle is a hash value derived from the compiled plan of the entire batch, and is guaranteed to be unique for every compiled plan. The plan_handle therefore serves as an identifier for a given compiled plan and is used by sys.dm_exec_cached_plans to retrieve the compiled plan for a batch.



The DMV sys.dm_os_memory_objects can be used to get information on all the top-level and sub-level memory objects associated with a compiled plan. This DMV has the memory_object_address as well as the parent_address of all the memory objects. It has also has the pages used by the memory object. The total of the pages_allocated_count of all the top level objects represents the total memory used by the compiled plan. This DMV also tells us the type of the memory object. The following memory object types are associated with a compiled plan:



MEMOBJ_COMPILE_ADHOC: Top level 8K compiled plan PMO.



MEMOBJ_QUERYEXECCNTXTFORSE: Top level 8K PMO Query execution context for SE, one for every XStmt that is a query.



MEMOBJ_EXECUTE: Top level 8K MXC PMO, contains the non recompilable XStmts in the batch).



MEMOBJ_PLANSKELETON: Sub PMO 512 bytes, allocated from the top level CP PMO. Maintains an array of CStmts.



MEMOBJ_STATEMENT: Sub PMO 512 bytes per non-recompilable CStmt created from top level CP PMO



MEMOBJ_XSTMT: Sub PMO 512 bytes for every recompilable XSTMT created from top level CP PMO).



MEMOBJ_CURSOREXEC: Sub PMO 512 bytes, one for every cursor.



Therefore given a plan_handle or the memory_object_address of a compiled plan, the memory layout of a compiled plan can pretty much be re-constructed from the DMV sys.dm_os_memory_objects. The function below does precisely that:



create function CompPlanDetails(@current_plan_address int, @plan_handle varbinary(64))


returns @details table


(


plan_handle varbinary(64) null,


memory_object_address varbinary(8) not null,


parent_address varbinary(8) null,


type nvarchar(60) null,


name nvarchar(256) null,


pages_allocated_count int not null,


page_size_in_bytes int not null,


page_allocator_address varbinary(8) not null


)


as


begin


-- Get the plan handle


if (@plan_handle is null)


select @plan_handle = plan_handle from sys.dm_exec_cached_plans where memory_object_address = @current_plan_address;



-- Get all top level pmos into a temp table.


with TopLevelPMOs as


(


select @plan_handle as plan_handle, mo2.memory_object_address, mo2.parent_address, mo2.type, mo2.name, mo2.pages_allocated_count, mo2.page_size_in_bytes, mo2.page_allocator_address


from sys.dm_os_memory_objects mo join sys.dm_os_memory_objects


mo2


on mo2.page_allocator_address = mo.page_allocator_address


where mo.memory_object_address = @current_plan_address


)



-- find sub-pmos from all top level pmos, and add them plus the top level pmos into the result table.


insert @details


select @plan_handle, mo3.memory_object_address, mo3.parent_address, mo3.type, mo3.name, mo3.pages_allocated_count, mo3.page_size_in_bytes, mo3.page_allocator_address


from sys.dm_os_memory_objects mo3 join TopLevelPMOs


on mo3.parent_address = TopLevelPMOs.memory_object_address


union all


select * from TopLevelPMOs


return


end


go



Now let us illustrate how to use this function with an example. Consider the following single statement batch executed by exactly one user at a given time:



select t1.col2, t2.col2 from t1 join t2 on t1.col1 = t2.col1 where t1.col1 = 50000


go



Execute the query and look up the plan_handle and memory_object_address from the DMVs using the query below:



select text, plan_handle, memory_object_address


from sys.dm_exec_cached_plans cp


cross apply sys.dm_exec_sql_Text(cp.plan_handle)


go




Text


Plan_handle


Memory_object_address


select t1.col2,


t2.col2 from t1


join t2 on t1.col1


= t2.col1


where t1.col1 = 50000


0x0600010029A7DD06B


8012B04000000000000


000000000000


0x042B00C0



Now pass these plan_handle and memory_object_address to the function CompPlanDetails.



select * from dbo.CompPlanDetails(0x042B00C0, 0x0600010029A7DD06B8012B04000000000000000000000000)


go



The function returns data detailing the memory layout as below:




Plan_Handle


Memory_


object_


address


Parent_


address


Type


Name


Pages_


alloca


ted_


count


Page_


size


_in


_bytes


Page_


Alloc


ator_


address


0x060001002


9A7DD06B801


2B040000000


00000000000


000000


0x042

B0938


0x042

B00C0


MEMOBJ_


XSTMT


NULL


17


512


0x042

B0398


0x060001002


9A7DD06B801


2B040000000


00000000000


000000


0x042

B0528


0x042

B00C0


MEMOBJ_


COMPILE_


ADHOC


NULL


18


512


0x042

B0398


0x060001002


9A7DD06B801


2B040000000


00000000000


000000


0x042

B00C0


NULL


MEMOBJ_


COMPILE_


ADHOC


NULL


3


8192


0x036

141D0


0x060001002


9A7DD06B801


2B040000000


00000000000


000000


0x03F

98028


NULL


MEMOBJ_


EXECUTE


NULL


1


8192


0x036

141D0


0x060001002


9A7DD06B801


2B040000000


00000000000


000000


0x042

88040


NULL


MEMOBJ_


QUERYEX


ECCNTXT


FORSE


NULL


1


8192


0x036

141D0



Notice that the MEMOBJ_XSTMT and MEMOBJ_COMPILE_ADHOC in the first two rows are have parent address of the top level CP PMO in row three. There is only one top level MEMOBJ_EXECUTE since the query was executed by exactly one user. If multiple users had executed the query simultaneously, then there would be more than one top level MXC.



Now consider the stored procedure below:



create procedure p1


as


begin


select col1 from t1


select col2 from t1 where col1 = 50000


end


go



exec p1


go



Executing the function CompPlanDetails with the appropriate plan handle and memory_object_address returns the following data:




Plan_



Handle


Memory_


object_


address


Parent_


address


Type


Name


Pages_


alloca


ted_


count


Page_


size_


in_


bytes


Page_


Allocator_


address


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B3168


0x03E

B20C0


MEMOBJ_


XSTMT


NULL


17


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B2F60


0x03E

B20C0


MEMOBJ_


XSTMT


NULL


17


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B2538


0x03E

B20C0


MEMOBJ_


COMPILE_


ADHOC


NULL


2


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B2948


0x03E

B20C0


MEMOBJ_


PLAN


SKELETON


NULL


1


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B2B50


0x03E

B20C0


MEMOBJ_


STATEMENT


NULL


17


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B2D58


0x03E

B20C0


MEMOBJ_


STATEMENT


NULL


17


512


0x03E

B23A8


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x042

00028


NULL


MEMOBJ_


EXECUTE


NULL


1


8192


0x036

12380


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

32040


NULL


MEMOBJ_


QUERY


EXECCNTXT


FORSE


NULL


1


8192


0x036

12380


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x041

74040


NULL


MEMOBJ_


QUERY


EXECCNTXT


FORSE


NULL


1


8192


0x036

12380


0x05000100


95555D02B8


21EB030000


0000000000


0000000000


0x03E

B20C0


NULL


MEMOBJ_


COMPILE_


ADHOC


NULL


5


8192


0x036

12380


Notice that since the procedure has multiple statements we now have a memory object of type MEMOBJ_PLANSKELETON, which is an array of CStmts. CStmts have type MEMOBJ_STATEMENT and in the above example there are 2 CStmts. The memory object MEMOBJ_COMPILE_ADHOC with page size 512 bytes has the top level CP PMO as parent. This memory object is used to allocate structures for execution. The memory layout is represented pictorially in the attached file.



Another useful stored procedure to analyze the memory layout of compiled plans is PlanBreakdown. The procedure PlanBreakdown gives a detailed summary of the memory object including how many CStmts, XStmts, Mxcs, Cursors, Plan Skeletons, and Query PMOs it contains and the size of the plan. This procedure generates two tables: PlanSummary and PlanDetails. The PlanSummary table has a row per plan with total size of the plan and number of CStmts, MXCs etc. The PlanDetails table has a row for every memory object. Note that while the total size of the plan as reported in PlanSummary table is accurate, it may not be the sum of the size of each of sub objects as reported in the PlanDetails table because they do not account for fragmentation.



create proc PlanBreakdown(@plan_addr varbinary(8) = null) as


begin


set nocount on



-- results tables


if object_id('PlanDetails', 'U') is not null


drop table PlanDetails



if object_id('PlanSummary', 'U') is not null


drop table PlanSummary



create table PlanDetails


(


plan_handle varbinary(64) null,


memory_object_address varbinary(8) not null,


parent_address varbinary(8) null,


type nvarchar(60) null,


name nvarchar(256) null,


pages_allocated_count int not null,


page_size_in_bytes int not null,


page_allocator_address varbinary(8) not null


)



create table PlanSummary


(


plan_handle varbinary(64) null,


memory_object_address varbinary(8) not null,


total_size int null,


cstmt_count int not null,


cstmt_size int not null,


xstmt_count int not null,


xstmt_size int not null,


cursor_count int not null,


cursor_size int not null,


mxc_count int not null,


mxc_size int not null,


query_count int not null,


query_size int not null,


skeleton_count int not null


)



-- temp table to hold the address of every plan that we're going to dump info for.


create table #plans(plan_address varbinary(8))



if (@plan_addr is null)


insert into #plans select memory_object_address from sys.dm_os_memory_objects


where type = 'MEMOBJ_COMPILE_ADHOC' and parent_address is NULL


else


insert into #plans values (@plan_addr)



declare plan_cursor cursor local for select plan_address from #plans


open plan_cursor



declare @current_plan_address varbinary(8)


fetch next from plan_cursor into @current_plan_address



while (@@fetch_status = 0)


begin


declare @plan_handle varbinary(64)


declare @total_size int


declare @cstmt_count int


declare @cstmt_size int


declare @xstmt_count int


declare @xstmt_size int


declare @cursor_count int


declare @cursor_size int


declare @mxc_count int


declare @mxc_size int


declare @query_count int


declare @query_size int


declare @skeleton_count int


set @plan_handle = null;


set @total_size = null;


set @cstmt_count = 0;


set @cstmt_size = 0;


set @xstmt_count = 0;


set @xstmt_size = 0;


set @cursor_count = 0;


set @cursor_size = 0;


set @mxc_count = 0;


set @mxc_size = 0;


set @query_count = 0;


set @query_size = 0;


set @skeleton_count = 0;



-- grab the plan handle and total size for the plan we're working on, if it exists


-- in dm_exec_cached_plans.


select @plan_handle = plan_handle, @total_size = size_in_bytes from


sys.dm_exec_cached_plans where memory_object_address = @current_plan_address



select * into #plan_details from CompPlanDetails(@current_plan_address, @plan_handle)



-- add the plan details to the results


insert into PlanDetails select * from #plan_details



-- If we didn't find this plan in sys.dm_exec_cached_plans, then go ahead and compute


-- the total_size by aggregating the pages used of all the top-level pmo's in the plan.


-- This really should be an accurate accounting of the plan memory usage too.


if (@plan_handle is null)


select @total_size = sum(pages_allocated_count * page_size_in_bytes) from #plan_details


where parent_address is null



-- form the summary information for the given plan.


declare detail_cursor cursor local for


select type, pages_allocated_count, page_size_in_bytes from #plan_details


open detail_cursor



declare @type varchar(256)


declare @pages int


declare @page_size int



fetch next from detail_cursor into @type, @pages, @page_size



while (@@fetch_status = 0)


begin


if (@type = 'MEMOBJ_XSTMT')


begin


set @xstmt_count = @xstmt_count + 1


set @xstmt_size = @xstmt_size + (@pages * @page_size)


end


else if (@type = 'MEMOBJ_EXECUTE')


begin


set @mxc_count = @mxc_count + 1


set @mxc_size = @mxc_size + (@pages * @page_size)


end


else if (@type = 'MEMOBJ_STATEMENT')


begin


set @cstmt_count = @cstmt_count + 1


set @cstmt_size = @cstmt_size + (@pages * @page_size)


end


else if (@type = 'MEMOBJ_CURSOREXEC')


begin


set @cursor_count = @cursor_count + 1


set @cursor_size = @cursor_size + (@pages * @page_size)


end


else if (@type = 'MEMOBJ_QUERYEXECCNTXTFORSE')


begin


set @query_count = @query_count + 1


set @query_size = @query_size + (@pages * @page_size)


end


else if (@type = 'MEMOBJ_PLANSKELETON')


begin


set @skeleton_count = @skeleton_count + 1


end



fetch next from detail_cursor into @type, @pages, @page_size


end



close detail_cursor


deallocate detail_cursor



insert into PlanSummary values(@plan_handle, @current_plan_address, @total_size, @cstmt_count, @cstmt_size, @xstmt_count, @xstmt_size, @cursor_count, @cursor_size, @mxc_count, @mxc_size, @query_count, @query_size, @skeleton_count)



drop table #plan_details


fetch next from plan_cursor into @current_plan_address


end



close plan_cursor


deallocate plan_cursor


end


go



To fetch the PlanSummary and PlanDetails for the stored procedure p1 in the above example use the queries below:



exec PlanBreakdown 0x040D40C0


go



-- See the summaries for each plan.


select * from PlanSummary



-- See the details for each plan.


select * from PlanDetails


go



Select * from PlanSummary returns one row as below: (note though that the data has been pivoted here for easy readability). The sizes reported here are in bytes.




plan_handle


0x05000100AB200


D4BB84137040000


000000000000000


00000


memory_object_address


0x043740C0


total_size


65536


cstmt_count


2


cstmt_size


17408


xstmt_count


2


xstmt_size


17408


cursor_count


0


cursor_size


0


mxc_count


1


mxc_size


8192


query_count


2


query_size


16384


skeleton_count


1



Now lets what happens to the memory objects when a query re-compiles:



Connection 1:



alter table t1 add col3 int


go



Connection 2:



create procedure p1


as


begin


---long running queries


select * from t1 where col1 = 5;


select * from t2 where col1 = 10;


---long running queries


end


go



exec p1


go



Execute the queries in connection 1 and 2 simultaneously. The first select query inside the stored procedure will be recompiled. Use the function CompPlanDetails to get the memory layout before executing the query in connection 1 and after executing the alter table query in connection 1. A subset of the rows returned before the query recompilation is as below:




Plan_handle


Memory_object_address


Parent_address


Type


0x05000100EAE880


7FB8415A04000000


000000000000000000


0x045A4948


0x045A40C0


MEMOBJ_


PLANSKELETON


0x05000100EAE880


7FB8415A04000000


000000000000000000


0x045A4B50


0x045A40C0


MEMOBJ_


STATEMENT


0x05000100EAE880


7FB8415A04000000


000000000000000000


0x045A4D58


0x045A40C0


MEMOBJ_


STATEMENT


0x05000100EAE880


7FB8415A04000000


000000000000000000


0x04362028


NULL


MEMOBJ_


EXECUTE



A subset of the result set returned by function CompPlanDetails after recompilation is below. After query recompilation, notice that the plan skeleton and the CStmt memory object address has been updated, while the parent address and the plan handle remain unchanged.




Plan_handle


Memory_object_address


Parent_address


Type


0x05000100EAE8807


FB8415A0400000000


0000000000000000


0x045A4F60


0x045A40C0


MEMOBJ_


PLANSKELETON


0x05000100EAE8807


FB8415A0400000000


0000000000000000


0x04362028


NULL


MEMOBJ_


EXECUTE


0x05000100EAE8807


FB8415A0400000000


0000000000000000


0x045A5168


0x045A40C0


MEMOBJ_


STATEMENT


0x05000100EAE8807


FB8415A0400000000


0000000000000000


0x045A4D58


0x045A40C0


MEMOBJ_


STATEMENT



memory_layout_example.vsd

Updated Mar 23, 2019
Version 2.0
No CommentsBe the first to comment
"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCoverImage\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeTitle\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTimeToRead\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeDescription\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309750"}],"cachedText({\"lastModified\":\"1745505309750\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309750"}]},"CachedAsset:pages-1745486122162":{"__typename":"CachedAsset","id":"pages-1745486122162","value":[{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730819800000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745486122162,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:SQL-Server":{"__typename":"Category","id":"category:SQL-Server","entityType":"CATEGORY","displayId":"SQL-Server","nodeType":"category","depth":3,"title":"SQL Server","shortTitle":"SQL Server","parent":{"__ref":"Category:category:products-services"}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:products-services":{"__typename":"Category","id":"category:products-services","displayId":"products-services","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Products","entityType":"CATEGORY","shortTitle":"Products"},"Blog:board:SQLServer":{"__typename":"Blog","id":"board:SQLServer","entityType":"BLOG","displayId":"SQLServer","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"SQL Server Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:SQL-Server"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:products-services"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:SQL-Server"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"SQL Server Blog","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"PRESET_ONLY"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc","height":512,"width":512,"mimeType":"image/png"},"Rank:rank:4":{"__typename":"Rank","id":"rank:4","position":6,"name":"Microsoft","color":"333333","icon":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}"},"rankStyle":"OUTLINE"},"User:user:297797":{"__typename":"User","id":"user:297797","uid":297797,"login":"sshekar","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-6.svg?time=0"},"rank":{"__ref":"Rank:rank:4"},"email":"","messagesCount":0,"biography":null,"topicsCount":0,"kudosReceivedCount":1,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-03-08T11:10:42.541-08:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"BlogTopicMessage:message:383203":{"__typename":"BlogTopicMessage","uid":383203,"subject":"1.0 Structure of the Plan Cache and Types of Cached Objects","id":"message:383203","revisionNum":2,"repliesCount":0,"author":{"__ref":"User:user:297797"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Blog:board:SQLServer"},"conversation":{"__ref":"Conversation:conversation:383203"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:383203"},"teaser":"First published on MSDN on Jan 09, 2007
table.","body":"\n \n \n First published on MSDN on Jan 09, 2007\n \n
\n
\n <br/><!--<br/> table.MsoNormalTable<br/>\t{mso-style-parent:\"\";<br/>\tfont-size:10.0pt;<br/>\tfont-family:\"Times New Roman\";<br/>\t}<br/> p.MsoNormal<br/>\t{mso-style-parent:\"\";<br/>\tmargin-bottom:.0001pt;<br/>\tfont-size:12.0pt;<br/>\tfont-family:\"Times New Roman\";<br/>\tmargin-left:0in; margin-right:0in; margin-top:0in}<br/>--><br/>\n
\n
\n

\n The plan cache is comprised of 4 separate cache stores: Object Plans (CACHESTORE_OBJCP), SQL Plans (CACHESTORE_SQLCP), Bound Trees (CACHESTORE_PHDR), and Extended Stored Procedures (CACHESTORE_XPROC). Each of these four cache stores conform to a uniform caching policy with respect to costing and removal of entries. Within each cache store is a hash table that is divided into hash buckets. Each hash bucket may contain one or more cached entries. The hash value of all cache entries is computed as (object_id * database_id) mod (hash table size), and this specifies the hash bucket. A cache key is used to find an exact match for a plan in the cache store hash table bucket.\n

\n
\n

\n

\n
\n

\n In the plan cache we cache the following types of objects: compiled plans (CP), execution plans (MXC), algebrizer trees (ProcHdr), Extended Procs (XProcs) and inactive cursors. Among these, compiled plans, algebrizer trees and extended procs are top level objects where as the execution plans and inactive cursors are dependant objects (dependant on the compiled plans). The section below describes each of these objects in greater detail including which of the four cache stores they reside in.\n

\n
\n

\n

\n
\n

\n \n 1.1 Types of Cached Objects\n \n

\n
\n

\n

\n
\n

\n \n 1.1.1 Compiled Plans (CP)\n \n

\n
\n

\n

\n
\n

\n When a query is compiled, a compiled plan is generated for the query. The cost of compiling a query each time is large; therefore we cache the compiled plans. There are two cache stores in which compiled plans are stored depending on the type of the compiled plan. If the query is dynamic sql or prepared, the compiled plan is stored in the SQL Plans (CACHESTORE_SQLCP) cache store. For modules like stored procedures, functions and triggers, the compiled plan is stored in Object Plans (CACHESTORE_OBJCP) cache store. Since the compiled plans are valuable and should to be kept in cache, when the cache stores are under memory pressure, cache removal policies ensure that these entries are not amongst the first to be removed. Compiled plans are also shared across multiple users.\n

\n
\n

\n

\n
\n

\n Compiled plans are generated for the entire batch, and not on a per statement (query) level. Therefore for a multi-statement batch, the compiled plan can be thought of as an array of plans containing the query plan for statements in that batch. It is important to understand that for a batch with multiple queries in it, the compiled plan will have the compiled query plans for all the queries in the batch.\n

\n
\n

\n

\n
\n

\n Internally each individual statement in a batch is represented by a CStmt (short for Compiled Statement). Each CStmt has the query plan for that particular statement. A compiled plan therefore has an array of CStmts that are in turn stored in a plan skeleton. In addition to the plan skeleton, the compiled plan also contains the parameter collection, symbol table, the top level memory object and the execution plans.\n

\n
\n

\n

\n
\n

\n Compiled Plans are non re-generatable entries since we can potentially get different compiled plans for queries compiled under different conditions or at different times. For consistency however, we want to keep the compiled plans in cache and re-execute the same plan to get the same behavior.\n

\n
\n

\n

\n
\n

\n \n 1.1.2 Execution Plans (MXC)\n \n

\n
\n

\n

\n
\n

\n Execution plans are run time objects and are dependant objects of a compiled plan. They cannot exist independent of a compiled plan. Just like the compiled plans there are two types of MXCs: SQL MXC and OBJ MXC. Being dependant objects (of compiled plans) they don’t live a separate cachestore. The compiled plan has 2 linked lists for MXCs: a lookup (or free) list and an enum list. The lookup list stores the free (or currently not in use) MXCs. The lookup list is used to get the MXC memory needed to execute a batch. The enum list is used to enumerate all the MXCs associated with the compiled plan, and is used by some dynamic management views (DMVs) and to generate statistics like total memory used by a batch. MXCs themselves contain the runtime parameters, local variable information; object ids for objects created at run time, run time state like currently executing statement amongst other things.\n

\n
\n

\n

\n
\n

\n During query execution, we generate an execution plan (MXC) from the compiled plan of the batch. Individual statement compiled plans get converted into to runtime query plans (XStmts). The XStmts are stored as a linked list inside the CStmts.\n

\n
\n

\n

\n
\n

\n Unlike compiled plans, execution plans are single user. For example, if there are N users executing the same batch simultaneously, there will be N MXCs associated with the same compiled plan. There is therefore a 1:N mapping between compiled plans and execution plans.\n

\n
\n

\n

\n
\n

\n MXCs are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.\n

\n
\n

\n

\n
\n

\n \n 1.1.3 Algebrizer Tree (ProcHdr)\n \n

\n
\n

\n

\n
\n

\n The algerbizer tree (ProcHdr) for views, constraints and defaults are cached in the Bound Trees (CACHESTORE_PHDR) cache store. The size of the bound trees cache store hash table is about 1/10th the size of the compiled plan cache store hash tables. The memory object from which each entry is allocated is 8K memory object.\n

\n
\n

\n

\n
\n

\n \n 1.1.4 Extended Procs (XProc)\n \n

\n
\n

\n

\n
\n

\n Extended Procs (Xprocs) are pre-defined system stored procedures like sp_ExecuteSql, sp_TraceCreate etc. They contain the function name and the DLL name of the implementation. They are stored in the Extended Stored Procedures (CACHESTORE_XPROC). The size of this cache store hash table is 127 entries. The memory object from which each entry is allocated is 256 bytes memory object.\n

\n
\n

\n

\n
\n

\n \n 1.1.5 Inactive Cursors\n \n

\n
\n

\n

\n
\n

\n Inactive cursors are cached in the compiled plan. Just like MXCs there are two lists maintained here: the lookup list and the enum list. The lookup list stores the inactive cursors. When a cursor is de-allocated, the memory used to store the cursor is cached. On subsequent re-execution of the batch with this cursor, the cached cursor memory is reused and re-initialized as an active cursor. The enum list has the list of active and inactive cursors and is used to enumerate all cursors for a compiled plan.\n

\n
\n

\n

\n
\n

\n Cursors are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.\n

\n
\n

\n

\n
\n

\n \n 1.2 Understanding Memory Layout of Compiled Plan using DMVs\n \n

\n
\n

\n

\n
\n

\n For a detailed summary of the memory layout refer to this\n \n posting\n \n . In this section we will take a look at the DMVs and learn more about the memory layout of compiled plans through examples.\n

\n
\n

\n

\n
\n

\n Sys.dm_exec_cached_plans has the plan_handle and the memory_object_address associated with every compiled plan. The plan_handle is a hash value derived from the compiled plan of the entire batch, and is guaranteed to be unique for every compiled plan. The plan_handle therefore serves as an identifier for a given compiled plan and is used by sys.dm_exec_cached_plans to retrieve the compiled plan for a batch.\n

\n
\n

\n

\n
\n

\n The DMV sys.dm_os_memory_objects can be used to get information on all the top-level and sub-level memory objects associated with a compiled plan. This DMV has the memory_object_address as well as the parent_address of all the memory objects. It has also has the pages used by the memory object. The total of the pages_allocated_count of all the top level objects represents the total memory used by the compiled plan. This DMV also tells us the type of the memory object. The following memory object types are associated with a compiled plan:\n

\n
\n

\n

\n
\n

\n MEMOBJ_COMPILE_ADHOC: Top level 8K compiled plan PMO.\n

\n
\n

\n

\n
\n

\n MEMOBJ_QUERYEXECCNTXTFORSE: Top level 8K PMO Query execution context for SE, one for every XStmt that is a query.\n

\n
\n

\n

\n
\n

\n MEMOBJ_EXECUTE: Top level 8K MXC PMO, contains the non recompilable XStmts in the batch).\n

\n
\n

\n

\n
\n

\n MEMOBJ_PLANSKELETON: Sub PMO 512 bytes, allocated from the top level CP PMO. Maintains an array of CStmts.\n

\n
\n

\n

\n
\n

\n MEMOBJ_STATEMENT: Sub PMO 512 bytes per non-recompilable CStmt created from top level CP PMO\n

\n
\n

\n

\n
\n

\n MEMOBJ_XSTMT: Sub PMO 512 bytes for every recompilable XSTMT created from top level CP PMO).\n

\n
\n

\n

\n
\n

\n MEMOBJ_CURSOREXEC: Sub PMO 512 bytes, one for every cursor.\n

\n
\n

\n

\n
\n

\n Therefore given a plan_handle or the memory_object_address of a compiled plan, the memory layout of a compiled plan can pretty much be re-constructed from the DMV sys.dm_os_memory_objects. The function below does precisely that:\n

\n
\n

\n

\n
\n

\n create function CompPlanDetails(@current_plan_address int, @plan_handle varbinary(64))\n

\n
\n

\n returns @details table\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n parent_address varbinary(8) null,\n

\n
\n

\n type nvarchar(60) null,\n

\n
\n

\n name nvarchar(256) null,\n

\n
\n

\n pages_allocated_count int not null,\n

\n
\n

\n page_size_in_bytes int not null,\n

\n
\n

\n page_allocator_address varbinary(8) not null\n

\n
\n

\n )\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n -- Get the plan handle\n

\n
\n

\n if (@plan_handle is null)\n

\n
\n

\n select @plan_handle = plan_handle from sys.dm_exec_cached_plans where memory_object_address = @current_plan_address;\n

\n
\n

\n

\n
\n

\n -- Get all top level pmos into a temp table.\n

\n
\n

\n with TopLevelPMOs as\n

\n
\n

\n (\n

\n
\n

\n select @plan_handle as plan_handle, mo2.memory_object_address, mo2.parent_address, mo2.type, mo2.name, mo2.pages_allocated_count, mo2.page_size_in_bytes, mo2.page_allocator_address\n

\n
\n

\n from sys.dm_os_memory_objects mo join sys.dm_os_memory_objects\n

\n
\n

\n mo2\n

\n
\n

\n on mo2.page_allocator_address = mo.page_allocator_address\n

\n
\n

\n where mo.memory_object_address = @current_plan_address\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n -- find sub-pmos from all top level pmos, and add them plus the top level pmos into the result table.\n

\n
\n

\n insert @details\n

\n
\n

\n select @plan_handle, mo3.memory_object_address, mo3.parent_address, mo3.type, mo3.name, mo3.pages_allocated_count, mo3.page_size_in_bytes, mo3.page_allocator_address\n

\n
\n

\n from sys.dm_os_memory_objects mo3 join TopLevelPMOs\n

\n
\n

\n on mo3.parent_address = TopLevelPMOs.memory_object_address\n

\n
\n

\n union all\n

\n
\n

\n select * from TopLevelPMOs\n

\n
\n

\n return\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Now let us illustrate how to use this function with an example. Consider the following single statement batch executed by exactly one user at a given time:\n

\n
\n

\n

\n
\n

\n select t1.col2, t2.col2 from t1 join t2 on t1.col1 = t2.col1 where t1.col1 = 50000\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Execute the query and look up the plan_handle and memory_object_address from the DMVs using the query below:\n

\n
\n

\n

\n
\n

\n select text, plan_handle, memory_object_address\n

\n
\n

\n from sys.dm_exec_cached_plans cp\n

\n
\n

\n cross apply sys.dm_exec_sql_Text(cp.plan_handle)\n

\n
\n

\n go\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Text\n \n

\n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n select t1.col2,\n

\n
\n

\n t2.col2 from t1\n

\n
\n

\n join t2 on t1.col1\n

\n
\n

\n = t2.col1\n

\n
\n

\n where t1.col1 = 50000\n

\n
\n
\n

\n 0x0600010029A7DD06B\n

\n
\n

\n 8012B04000000000000\n

\n
\n

\n 000000000000\n

\n
\n
\n

\n 0x042B00C0\n

\n
\n
\n

\n

\n
\n

\n Now pass these plan_handle and memory_object_address to the function CompPlanDetails.\n

\n
\n

\n

\n
\n

\n select * from dbo.CompPlanDetails(0x042B00C0, 0x0600010029A7DD06B8012B04000000000000000000000000)\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n The function returns data detailing the memory layout as below:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_Handle\n \n

\n
\n
\n

\n \n Memory_\n \n

\n
\n

\n \n object_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Parent_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n \n Name\n \n

\n
\n
\n

\n \n Pages_\n \n

\n
\n

\n \n alloca\n \n

\n
\n

\n \n ted_\n \n

\n
\n

\n \n count\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n size\n \n

\n
\n

\n \n _in\n \n

\n
\n

\n \n _bytes\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n Alloc\n \n

\n
\n

\n \n ator_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0938\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0398\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0528\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 18\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0398\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 3\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x03F\n
\n

\n

\n 98028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n 88040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERYEX\n

\n
\n

\n ECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n

\n
\n

\n Notice that the MEMOBJ_XSTMT and MEMOBJ_COMPILE_ADHOC in the first two rows are have parent address of the top level CP PMO in row three. There is only one top level MEMOBJ_EXECUTE since the query was executed by exactly one user. If multiple users had executed the query simultaneously, then there would be more than one top level MXC.\n

\n
\n

\n

\n
\n

\n Now consider the stored procedure below:\n

\n
\n

\n

\n
\n

\n create procedure p1\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n select col1 from t1\n

\n
\n

\n select col2 from t1 where col1 = 50000\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n exec p1\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Executing the function CompPlanDetails with the appropriate plan handle and memory_object_address returns the following data:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_\n \n

\n
\n

\n \n \n

\n
\n

\n \n Handle\n \n

\n
\n
\n

\n \n Memory_\n \n

\n
\n

\n \n object_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Parent_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n \n Name\n \n

\n
\n
\n

\n \n Pages_\n \n

\n
\n

\n \n alloca\n \n

\n
\n

\n \n ted_\n \n

\n
\n

\n \n count\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n size_\n \n

\n
\n

\n \n in_\n \n

\n
\n

\n \n bytes\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n Allocator_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B3168\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2F60\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2538\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 2\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2948\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLAN\n

\n
\n

\n SKELETON\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2B50\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2D58\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n 00028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n 32040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERY\n

\n
\n

\n EXECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x041\n
\n

\n

\n 74040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERY\n

\n
\n

\n EXECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 5\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n Notice that since the procedure has multiple statements we now have a memory object of type MEMOBJ_PLANSKELETON, which is an array of CStmts. CStmts have type MEMOBJ_STATEMENT and in the above example there are 2 CStmts. The memory object MEMOBJ_COMPILE_ADHOC with page size 512 bytes has the top level CP PMO as parent. This memory object is used to allocate structures for execution. The memory layout is represented pictorially in the attached file.\n

\n
\n

\n

\n
\n

\n Another useful stored procedure to analyze the memory layout of compiled plans is PlanBreakdown. The procedure PlanBreakdown gives a detailed summary of the memory object including how many CStmts, XStmts, Mxcs, Cursors, Plan Skeletons, and Query PMOs it contains and the size of the plan. This procedure generates two tables: PlanSummary and PlanDetails. The PlanSummary table has a row per plan with total size of the plan and number of CStmts, MXCs etc. The PlanDetails table has a row for every memory object. Note that while the total size of the plan as reported in PlanSummary table is accurate, it may not be the sum of the size of each of sub objects as reported in the PlanDetails table because they do not account for fragmentation.\n

\n
\n

\n

\n
\n

\n create proc PlanBreakdown(@plan_addr varbinary(8) = null) as\n

\n
\n

\n begin\n

\n
\n

\n set nocount on\n

\n
\n

\n

\n
\n

\n -- results tables\n

\n
\n

\n if object_id('PlanDetails', 'U') is not null\n

\n
\n

\n drop table PlanDetails\n

\n
\n

\n

\n
\n

\n if object_id('PlanSummary', 'U') is not null\n

\n
\n

\n drop table PlanSummary\n

\n
\n

\n

\n
\n

\n create table PlanDetails\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n parent_address varbinary(8) null,\n

\n
\n

\n type nvarchar(60) null,\n

\n
\n

\n name nvarchar(256) null,\n

\n
\n

\n pages_allocated_count int not null,\n

\n
\n

\n page_size_in_bytes int not null,\n

\n
\n

\n page_allocator_address varbinary(8) not null\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n create table PlanSummary\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n total_size int null,\n

\n
\n

\n cstmt_count int not null,\n

\n
\n

\n cstmt_size int not null,\n

\n
\n

\n xstmt_count int not null,\n

\n
\n

\n xstmt_size int not null,\n

\n
\n

\n cursor_count int not null,\n

\n
\n

\n cursor_size int not null,\n

\n
\n

\n mxc_count int not null,\n

\n
\n

\n mxc_size int not null,\n

\n
\n

\n query_count int not null,\n

\n
\n

\n query_size int not null,\n

\n
\n

\n skeleton_count int not null\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n -- temp table to hold the address of every plan that we're going to dump info for.\n

\n
\n

\n create table #plans(plan_address varbinary(8))\n

\n
\n

\n

\n
\n

\n if (@plan_addr is null)\n

\n
\n

\n insert into #plans select memory_object_address from sys.dm_os_memory_objects\n

\n
\n

\n where type = 'MEMOBJ_COMPILE_ADHOC' and parent_address is NULL\n

\n
\n

\n else\n

\n
\n

\n insert into #plans values (@plan_addr)\n

\n
\n

\n

\n
\n

\n declare plan_cursor cursor local for select plan_address from #plans\n

\n
\n

\n open plan_cursor\n

\n
\n

\n

\n
\n

\n declare @current_plan_address varbinary(8)\n

\n
\n

\n fetch next from plan_cursor into @current_plan_address\n

\n
\n

\n

\n
\n

\n while (@@fetch_status = 0)\n

\n
\n

\n begin\n

\n
\n

\n declare @plan_handle varbinary(64)\n

\n
\n

\n declare @total_size int\n

\n
\n

\n declare @cstmt_count int\n

\n
\n

\n declare @cstmt_size int\n

\n
\n

\n declare @xstmt_count int\n

\n
\n

\n declare @xstmt_size int\n

\n
\n

\n declare @cursor_count int\n

\n
\n

\n declare @cursor_size int\n

\n
\n

\n declare @mxc_count int\n

\n
\n

\n declare @mxc_size int\n

\n
\n

\n declare @query_count int\n

\n
\n

\n declare @query_size int\n

\n
\n

\n declare @skeleton_count int\n

\n
\n

\n set @plan_handle = null;\n

\n
\n

\n set @total_size = null;\n

\n
\n

\n set @cstmt_count = 0;\n

\n
\n

\n set @cstmt_size = 0;\n

\n
\n

\n set @xstmt_count = 0;\n

\n
\n

\n set @xstmt_size = 0;\n

\n
\n

\n set @cursor_count = 0;\n

\n
\n

\n set @cursor_size = 0;\n

\n
\n

\n set @mxc_count = 0;\n

\n
\n

\n set @mxc_size = 0;\n

\n
\n

\n set @query_count = 0;\n

\n
\n

\n set @query_size = 0;\n

\n
\n

\n set @skeleton_count = 0;\n

\n
\n

\n

\n
\n

\n -- grab the plan handle and total size for the plan we're working on, if it exists\n

\n
\n

\n -- in dm_exec_cached_plans.\n

\n
\n

\n select @plan_handle = plan_handle, @total_size = size_in_bytes from\n

\n
\n

\n sys.dm_exec_cached_plans where memory_object_address = @current_plan_address\n

\n
\n

\n

\n
\n

\n select * into #plan_details from CompPlanDetails(@current_plan_address, @plan_handle)\n

\n
\n

\n

\n
\n

\n -- add the plan details to the results\n

\n
\n

\n insert into PlanDetails select * from #plan_details\n

\n
\n

\n

\n
\n

\n -- If we didn't find this plan in sys.dm_exec_cached_plans, then go ahead and compute\n

\n
\n

\n -- the total_size by aggregating the pages used of all the top-level pmo's in the plan.\n

\n
\n

\n -- This really should be an accurate accounting of the plan memory usage too.\n

\n
\n

\n if (@plan_handle is null)\n

\n
\n

\n select @total_size = sum(pages_allocated_count * page_size_in_bytes) from #plan_details\n

\n
\n

\n where parent_address is null\n

\n
\n

\n

\n
\n

\n -- form the summary information for the given plan.\n

\n
\n

\n declare detail_cursor cursor local for\n

\n
\n

\n select type, pages_allocated_count, page_size_in_bytes from #plan_details\n

\n
\n

\n open detail_cursor\n

\n
\n

\n

\n
\n

\n declare @type varchar(256)\n

\n
\n

\n declare @pages int\n

\n
\n

\n declare @page_size int\n

\n
\n

\n

\n
\n

\n fetch next from detail_cursor into @type, @pages, @page_size\n

\n
\n

\n

\n
\n

\n while (@@fetch_status = 0)\n

\n
\n

\n begin\n

\n
\n

\n if (@type = 'MEMOBJ_XSTMT')\n

\n
\n

\n begin\n

\n
\n

\n set @xstmt_count = @xstmt_count + 1\n

\n
\n

\n set @xstmt_size = @xstmt_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_EXECUTE')\n

\n
\n

\n begin\n

\n
\n

\n set @mxc_count = @mxc_count + 1\n

\n
\n

\n set @mxc_size = @mxc_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_STATEMENT')\n

\n
\n

\n begin\n

\n
\n

\n set @cstmt_count = @cstmt_count + 1\n

\n
\n

\n set @cstmt_size = @cstmt_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_CURSOREXEC')\n

\n
\n

\n begin\n

\n
\n

\n set @cursor_count = @cursor_count + 1\n

\n
\n

\n set @cursor_size = @cursor_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_QUERYEXECCNTXTFORSE')\n

\n
\n

\n begin\n

\n
\n

\n set @query_count = @query_count + 1\n

\n
\n

\n set @query_size = @query_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_PLANSKELETON')\n

\n
\n

\n begin\n

\n
\n

\n set @skeleton_count = @skeleton_count + 1\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n fetch next from detail_cursor into @type, @pages, @page_size\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n close detail_cursor\n

\n
\n

\n deallocate detail_cursor\n

\n
\n

\n

\n
\n

\n insert into PlanSummary values(@plan_handle, @current_plan_address, @total_size, @cstmt_count, @cstmt_size, @xstmt_count, @xstmt_size, @cursor_count, @cursor_size, @mxc_count, @mxc_size, @query_count, @query_size, @skeleton_count)\n

\n
\n

\n

\n
\n

\n drop table #plan_details\n

\n
\n

\n fetch next from plan_cursor into @current_plan_address\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n close plan_cursor\n

\n
\n

\n deallocate plan_cursor\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n To fetch the PlanSummary and PlanDetails for the stored procedure p1 in the above example use the queries below:\n

\n
\n

\n

\n
\n

\n exec PlanBreakdown 0x040D40C0\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n -- See the summaries for each plan.\n

\n
\n

\n select * from PlanSummary\n

\n
\n

\n

\n
\n

\n -- See the details for each plan.\n

\n
\n

\n select * from PlanDetails\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Select * from PlanSummary returns one row as below: (note though that the data has been pivoted here for easy readability). The sizes reported here are in bytes.\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n plan_handle\n \n

\n
\n
\n

\n 0x05000100AB200\n

\n
\n

\n D4BB84137040000\n

\n
\n

\n 000000000000000\n

\n
\n

\n 00000\n

\n
\n
\n

\n \n memory_object_address\n \n

\n
\n
\n

\n 0x043740C0\n

\n
\n
\n

\n \n total_size\n \n

\n
\n
\n

\n 65536\n

\n
\n
\n

\n \n cstmt_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n cstmt_size\n \n

\n
\n
\n

\n 17408\n

\n
\n
\n

\n \n xstmt_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n xstmt_size\n \n

\n
\n
\n

\n 17408\n

\n
\n
\n

\n \n cursor_count\n \n

\n
\n
\n

\n 0\n

\n
\n
\n

\n \n cursor_size\n \n

\n
\n
\n

\n 0\n

\n
\n
\n

\n \n mxc_count\n \n

\n
\n
\n

\n 1\n

\n
\n
\n

\n \n mxc_size\n \n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n \n query_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n query_size\n \n

\n
\n
\n

\n 16384\n

\n
\n
\n

\n \n skeleton_count\n \n

\n
\n
\n

\n 1\n

\n
\n
\n

\n

\n
\n

\n Now lets what happens to the memory objects when a query re-compiles:\n

\n
\n

\n

\n
\n

\n Connection 1:\n

\n
\n

\n

\n
\n

\n alter table t1 add col3 int\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Connection 2:\n

\n
\n

\n

\n
\n

\n create procedure p1\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n ---long running queries\n

\n
\n

\n select * from t1 where col1 = 5;\n

\n
\n

\n select * from t2 where col1 = 10;\n

\n
\n

\n ---long running queries\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n exec p1\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Execute the queries in connection 1 and 2 simultaneously. The first select query inside the stored procedure will be recompiled. Use the function CompPlanDetails to get the memory layout before executing the query in connection 1 and after executing the alter table query in connection 1. A subset of the rows returned before the query recompilation is as below:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n \n Parent_address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4948\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLANSKELETON\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4B50\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4D58\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x04362028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n

\n
\n

\n A subset of the result set returned by function CompPlanDetails after recompilation is below. After query recompilation, notice that the plan skeleton and the CStmt memory object address has been updated, while the parent address and the plan handle remain unchanged.\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n \n Parent_address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A4F60\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLANSKELETON\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x04362028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A5168\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A4D58\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n

\n
\n

\n \n memory_layout_example.vsd\n \n

\n \n","body@stringLength":"52179","rawBody":"\n \n \n First published on MSDN on Jan 09, 2007\n \n
\n
\n <br/><!--<br/> table.MsoNormalTable<br/>\t{mso-style-parent:\"\";<br/>\tfont-size:10.0pt;<br/>\tfont-family:\"Times New Roman\";<br/>\t}<br/> p.MsoNormal<br/>\t{mso-style-parent:\"\";<br/>\tmargin-bottom:.0001pt;<br/>\tfont-size:12.0pt;<br/>\tfont-family:\"Times New Roman\";<br/>\tmargin-left:0in; margin-right:0in; margin-top:0in}<br/>--><br/>\n
\n
\n

\n The plan cache is comprised of 4 separate cache stores: Object Plans (CACHESTORE_OBJCP), SQL Plans (CACHESTORE_SQLCP), Bound Trees (CACHESTORE_PHDR), and Extended Stored Procedures (CACHESTORE_XPROC). Each of these four cache stores conform to a uniform caching policy with respect to costing and removal of entries. Within each cache store is a hash table that is divided into hash buckets. Each hash bucket may contain one or more cached entries. The hash value of all cache entries is computed as (object_id * database_id) mod (hash table size), and this specifies the hash bucket. A cache key is used to find an exact match for a plan in the cache store hash table bucket.\n

\n
\n

\n

\n
\n

\n In the plan cache we cache the following types of objects: compiled plans (CP), execution plans (MXC), algebrizer trees (ProcHdr), Extended Procs (XProcs) and inactive cursors. Among these, compiled plans, algebrizer trees and extended procs are top level objects where as the execution plans and inactive cursors are dependant objects (dependant on the compiled plans). The section below describes each of these objects in greater detail including which of the four cache stores they reside in.\n

\n
\n

\n

\n
\n

\n \n 1.1 Types of Cached Objects\n \n

\n
\n

\n

\n
\n

\n \n 1.1.1 Compiled Plans (CP)\n \n

\n
\n

\n

\n
\n

\n When a query is compiled, a compiled plan is generated for the query. The cost of compiling a query each time is large; therefore we cache the compiled plans. There are two cache stores in which compiled plans are stored depending on the type of the compiled plan. If the query is dynamic sql or prepared, the compiled plan is stored in the SQL Plans (CACHESTORE_SQLCP) cache store. For modules like stored procedures, functions and triggers, the compiled plan is stored in Object Plans (CACHESTORE_OBJCP) cache store. Since the compiled plans are valuable and should to be kept in cache, when the cache stores are under memory pressure, cache removal policies ensure that these entries are not amongst the first to be removed. Compiled plans are also shared across multiple users.\n

\n
\n

\n

\n
\n

\n Compiled plans are generated for the entire batch, and not on a per statement (query) level. Therefore for a multi-statement batch, the compiled plan can be thought of as an array of plans containing the query plan for statements in that batch. It is important to understand that for a batch with multiple queries in it, the compiled plan will have the compiled query plans for all the queries in the batch.\n

\n
\n

\n

\n
\n

\n Internally each individual statement in a batch is represented by a CStmt (short for Compiled Statement). Each CStmt has the query plan for that particular statement. A compiled plan therefore has an array of CStmts that are in turn stored in a plan skeleton. In addition to the plan skeleton, the compiled plan also contains the parameter collection, symbol table, the top level memory object and the execution plans.\n

\n
\n

\n

\n
\n

\n Compiled Plans are non re-generatable entries since we can potentially get different compiled plans for queries compiled under different conditions or at different times. For consistency however, we want to keep the compiled plans in cache and re-execute the same plan to get the same behavior.\n

\n
\n

\n

\n
\n

\n \n 1.1.2 Execution Plans (MXC)\n \n

\n
\n

\n

\n
\n

\n Execution plans are run time objects and are dependant objects of a compiled plan. They cannot exist independent of a compiled plan. Just like the compiled plans there are two types of MXCs: SQL MXC and OBJ MXC. Being dependant objects (of compiled plans) they don’t live a separate cachestore. The compiled plan has 2 linked lists for MXCs: a lookup (or free) list and an enum list. The lookup list stores the free (or currently not in use) MXCs. The lookup list is used to get the MXC memory needed to execute a batch. The enum list is used to enumerate all the MXCs associated with the compiled plan, and is used by some dynamic management views (DMVs) and to generate statistics like total memory used by a batch. MXCs themselves contain the runtime parameters, local variable information; object ids for objects created at run time, run time state like currently executing statement amongst other things.\n

\n
\n

\n

\n
\n

\n During query execution, we generate an execution plan (MXC) from the compiled plan of the batch. Individual statement compiled plans get converted into to runtime query plans (XStmts). The XStmts are stored as a linked list inside the CStmts.\n

\n
\n

\n

\n
\n

\n Unlike compiled plans, execution plans are single user. For example, if there are N users executing the same batch simultaneously, there will be N MXCs associated with the same compiled plan. There is therefore a 1:N mapping between compiled plans and execution plans.\n

\n
\n

\n

\n
\n

\n MXCs are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.\n

\n
\n

\n

\n
\n

\n \n 1.1.3 Algebrizer Tree (ProcHdr)\n \n

\n
\n

\n

\n
\n

\n The algerbizer tree (ProcHdr) for views, constraints and defaults are cached in the Bound Trees (CACHESTORE_PHDR) cache store. The size of the bound trees cache store hash table is about 1/10th the size of the compiled plan cache store hash tables. The memory object from which each entry is allocated is 8K memory object.\n

\n
\n

\n

\n
\n

\n \n 1.1.4 Extended Procs (XProc)\n \n

\n
\n

\n

\n
\n

\n Extended Procs (Xprocs) are pre-defined system stored procedures like sp_ExecuteSql, sp_TraceCreate etc. They contain the function name and the DLL name of the implementation. They are stored in the Extended Stored Procedures (CACHESTORE_XPROC). The size of this cache store hash table is 127 entries. The memory object from which each entry is allocated is 256 bytes memory object.\n

\n
\n

\n

\n
\n

\n \n 1.1.5 Inactive Cursors\n \n

\n
\n

\n

\n
\n

\n Inactive cursors are cached in the compiled plan. Just like MXCs there are two lists maintained here: the lookup list and the enum list. The lookup list stores the inactive cursors. When a cursor is de-allocated, the memory used to store the cursor is cached. On subsequent re-execution of the batch with this cursor, the cached cursor memory is reused and re-initialized as an active cursor. The enum list has the list of active and inactive cursors and is used to enumerate all cursors for a compiled plan.\n

\n
\n

\n

\n
\n

\n Cursors are re-generatable given a compiled plan. Relative to compiled plans they are also relatively inexpensive to re-generate.\n

\n
\n

\n

\n
\n

\n \n 1.2 Understanding Memory Layout of Compiled Plan using DMVs\n \n

\n
\n

\n

\n
\n

\n For a detailed summary of the memory layout refer to this\n \n posting\n \n . In this section we will take a look at the DMVs and learn more about the memory layout of compiled plans through examples.\n

\n
\n

\n

\n
\n

\n Sys.dm_exec_cached_plans has the plan_handle and the memory_object_address associated with every compiled plan. The plan_handle is a hash value derived from the compiled plan of the entire batch, and is guaranteed to be unique for every compiled plan. The plan_handle therefore serves as an identifier for a given compiled plan and is used by sys.dm_exec_cached_plans to retrieve the compiled plan for a batch.\n

\n
\n

\n

\n
\n

\n The DMV sys.dm_os_memory_objects can be used to get information on all the top-level and sub-level memory objects associated with a compiled plan. This DMV has the memory_object_address as well as the parent_address of all the memory objects. It has also has the pages used by the memory object. The total of the pages_allocated_count of all the top level objects represents the total memory used by the compiled plan. This DMV also tells us the type of the memory object. The following memory object types are associated with a compiled plan:\n

\n
\n

\n

\n
\n

\n MEMOBJ_COMPILE_ADHOC: Top level 8K compiled plan PMO.\n

\n
\n

\n

\n
\n

\n MEMOBJ_QUERYEXECCNTXTFORSE: Top level 8K PMO Query execution context for SE, one for every XStmt that is a query.\n

\n
\n

\n

\n
\n

\n MEMOBJ_EXECUTE: Top level 8K MXC PMO, contains the non recompilable XStmts in the batch).\n

\n
\n

\n

\n
\n

\n MEMOBJ_PLANSKELETON: Sub PMO 512 bytes, allocated from the top level CP PMO. Maintains an array of CStmts.\n

\n
\n

\n

\n
\n

\n MEMOBJ_STATEMENT: Sub PMO 512 bytes per non-recompilable CStmt created from top level CP PMO\n

\n
\n

\n

\n
\n

\n MEMOBJ_XSTMT: Sub PMO 512 bytes for every recompilable XSTMT created from top level CP PMO).\n

\n
\n

\n

\n
\n

\n MEMOBJ_CURSOREXEC: Sub PMO 512 bytes, one for every cursor.\n

\n
\n

\n

\n
\n

\n Therefore given a plan_handle or the memory_object_address of a compiled plan, the memory layout of a compiled plan can pretty much be re-constructed from the DMV sys.dm_os_memory_objects. The function below does precisely that:\n

\n
\n

\n

\n
\n

\n create function CompPlanDetails(@current_plan_address int, @plan_handle varbinary(64))\n

\n
\n

\n returns @details table\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n parent_address varbinary(8) null,\n

\n
\n

\n type nvarchar(60) null,\n

\n
\n

\n name nvarchar(256) null,\n

\n
\n

\n pages_allocated_count int not null,\n

\n
\n

\n page_size_in_bytes int not null,\n

\n
\n

\n page_allocator_address varbinary(8) not null\n

\n
\n

\n )\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n -- Get the plan handle\n

\n
\n

\n if (@plan_handle is null)\n

\n
\n

\n select @plan_handle = plan_handle from sys.dm_exec_cached_plans where memory_object_address = @current_plan_address;\n

\n
\n

\n

\n
\n

\n -- Get all top level pmos into a temp table.\n

\n
\n

\n with TopLevelPMOs as\n

\n
\n

\n (\n

\n
\n

\n select @plan_handle as plan_handle, mo2.memory_object_address, mo2.parent_address, mo2.type, mo2.name, mo2.pages_allocated_count, mo2.page_size_in_bytes, mo2.page_allocator_address\n

\n
\n

\n from sys.dm_os_memory_objects mo join sys.dm_os_memory_objects\n

\n
\n

\n mo2\n

\n
\n

\n on mo2.page_allocator_address = mo.page_allocator_address\n

\n
\n

\n where mo.memory_object_address = @current_plan_address\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n -- find sub-pmos from all top level pmos, and add them plus the top level pmos into the result table.\n

\n
\n

\n insert @details\n

\n
\n

\n select @plan_handle, mo3.memory_object_address, mo3.parent_address, mo3.type, mo3.name, mo3.pages_allocated_count, mo3.page_size_in_bytes, mo3.page_allocator_address\n

\n
\n

\n from sys.dm_os_memory_objects mo3 join TopLevelPMOs\n

\n
\n

\n on mo3.parent_address = TopLevelPMOs.memory_object_address\n

\n
\n

\n union all\n

\n
\n

\n select * from TopLevelPMOs\n

\n
\n

\n return\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Now let us illustrate how to use this function with an example. Consider the following single statement batch executed by exactly one user at a given time:\n

\n
\n

\n

\n
\n

\n select t1.col2, t2.col2 from t1 join t2 on t1.col1 = t2.col1 where t1.col1 = 50000\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Execute the query and look up the plan_handle and memory_object_address from the DMVs using the query below:\n

\n
\n

\n

\n
\n

\n select text, plan_handle, memory_object_address\n

\n
\n

\n from sys.dm_exec_cached_plans cp\n

\n
\n

\n cross apply sys.dm_exec_sql_Text(cp.plan_handle)\n

\n
\n

\n go\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Text\n \n

\n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n select t1.col2,\n

\n
\n

\n t2.col2 from t1\n

\n
\n

\n join t2 on t1.col1\n

\n
\n

\n = t2.col1\n

\n
\n

\n where t1.col1 = 50000\n

\n
\n
\n

\n 0x0600010029A7DD06B\n

\n
\n

\n 8012B04000000000000\n

\n
\n

\n 000000000000\n

\n
\n
\n

\n 0x042B00C0\n

\n
\n
\n

\n

\n
\n

\n Now pass these plan_handle and memory_object_address to the function CompPlanDetails.\n

\n
\n

\n

\n
\n

\n select * from dbo.CompPlanDetails(0x042B00C0, 0x0600010029A7DD06B8012B04000000000000000000000000)\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n The function returns data detailing the memory layout as below:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_Handle\n \n

\n
\n
\n

\n \n Memory_\n \n

\n
\n

\n \n object_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Parent_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n \n Name\n \n

\n
\n
\n

\n \n Pages_\n \n

\n
\n

\n \n alloca\n \n

\n
\n

\n \n ted_\n \n

\n
\n

\n \n count\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n size\n \n

\n
\n

\n \n _in\n \n

\n
\n

\n \n _bytes\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n Alloc\n \n

\n
\n

\n \n ator_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0938\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0398\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0528\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 18\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B0398\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n B00C0\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 3\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x03F\n
\n

\n

\n 98028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n 0x060001002\n

\n
\n

\n 9A7DD06B801\n

\n
\n

\n 2B040000000\n

\n
\n

\n 00000000000\n

\n
\n

\n 000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n 88040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERYEX\n

\n
\n

\n ECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 141D0\n

\n
\n
\n

\n

\n
\n

\n Notice that the MEMOBJ_XSTMT and MEMOBJ_COMPILE_ADHOC in the first two rows are have parent address of the top level CP PMO in row three. There is only one top level MEMOBJ_EXECUTE since the query was executed by exactly one user. If multiple users had executed the query simultaneously, then there would be more than one top level MXC.\n

\n
\n

\n

\n
\n

\n Now consider the stored procedure below:\n

\n
\n

\n

\n
\n

\n create procedure p1\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n select col1 from t1\n

\n
\n

\n select col2 from t1 where col1 = 50000\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n exec p1\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Executing the function CompPlanDetails with the appropriate plan handle and memory_object_address returns the following data:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_\n \n

\n
\n

\n \n \n

\n
\n

\n \n Handle\n \n

\n
\n
\n

\n \n Memory_\n \n

\n
\n

\n \n object_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Parent_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n \n Name\n \n

\n
\n
\n

\n \n Pages_\n \n

\n
\n

\n \n alloca\n \n

\n
\n

\n \n ted_\n \n

\n
\n

\n \n count\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n size_\n \n

\n
\n

\n \n in_\n \n

\n
\n

\n \n bytes\n \n

\n
\n
\n

\n \n Page_\n \n

\n
\n

\n \n Allocator_\n \n

\n
\n

\n \n address\n \n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B3168\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2F60\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n XSTMT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2538\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 2\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2948\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLAN\n

\n
\n

\n SKELETON\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2B50\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B2D58\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 17\n

\n
\n
\n

\n 512\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B23A8\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x042\n
\n

\n

\n 00028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n 32040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERY\n

\n
\n

\n EXECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x041\n
\n

\n

\n 74040\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n QUERY\n

\n
\n

\n EXECCNTXT\n

\n
\n

\n FORSE\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 1\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n 0x05000100\n

\n
\n

\n 95555D02B8\n

\n
\n

\n 21EB030000\n

\n
\n

\n 0000000000\n

\n
\n

\n 0000000000\n

\n
\n
\n

\n 0x03E\n
\n

\n

\n B20C0\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n COMPILE_\n

\n
\n

\n ADHOC\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n 5\n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n 0x036\n
\n

\n

\n 12380\n

\n
\n
\n

\n Notice that since the procedure has multiple statements we now have a memory object of type MEMOBJ_PLANSKELETON, which is an array of CStmts. CStmts have type MEMOBJ_STATEMENT and in the above example there are 2 CStmts. The memory object MEMOBJ_COMPILE_ADHOC with page size 512 bytes has the top level CP PMO as parent. This memory object is used to allocate structures for execution. The memory layout is represented pictorially in the attached file.\n

\n
\n

\n

\n
\n

\n Another useful stored procedure to analyze the memory layout of compiled plans is PlanBreakdown. The procedure PlanBreakdown gives a detailed summary of the memory object including how many CStmts, XStmts, Mxcs, Cursors, Plan Skeletons, and Query PMOs it contains and the size of the plan. This procedure generates two tables: PlanSummary and PlanDetails. The PlanSummary table has a row per plan with total size of the plan and number of CStmts, MXCs etc. The PlanDetails table has a row for every memory object. Note that while the total size of the plan as reported in PlanSummary table is accurate, it may not be the sum of the size of each of sub objects as reported in the PlanDetails table because they do not account for fragmentation.\n

\n
\n

\n

\n
\n

\n create proc PlanBreakdown(@plan_addr varbinary(8) = null) as\n

\n
\n

\n begin\n

\n
\n

\n set nocount on\n

\n
\n

\n

\n
\n

\n -- results tables\n

\n
\n

\n if object_id('PlanDetails', 'U') is not null\n

\n
\n

\n drop table PlanDetails\n

\n
\n

\n

\n
\n

\n if object_id('PlanSummary', 'U') is not null\n

\n
\n

\n drop table PlanSummary\n

\n
\n

\n

\n
\n

\n create table PlanDetails\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n parent_address varbinary(8) null,\n

\n
\n

\n type nvarchar(60) null,\n

\n
\n

\n name nvarchar(256) null,\n

\n
\n

\n pages_allocated_count int not null,\n

\n
\n

\n page_size_in_bytes int not null,\n

\n
\n

\n page_allocator_address varbinary(8) not null\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n create table PlanSummary\n

\n
\n

\n (\n

\n
\n

\n plan_handle varbinary(64) null,\n

\n
\n

\n memory_object_address varbinary(8) not null,\n

\n
\n

\n total_size int null,\n

\n
\n

\n cstmt_count int not null,\n

\n
\n

\n cstmt_size int not null,\n

\n
\n

\n xstmt_count int not null,\n

\n
\n

\n xstmt_size int not null,\n

\n
\n

\n cursor_count int not null,\n

\n
\n

\n cursor_size int not null,\n

\n
\n

\n mxc_count int not null,\n

\n
\n

\n mxc_size int not null,\n

\n
\n

\n query_count int not null,\n

\n
\n

\n query_size int not null,\n

\n
\n

\n skeleton_count int not null\n

\n
\n

\n )\n

\n
\n

\n

\n
\n

\n -- temp table to hold the address of every plan that we're going to dump info for.\n

\n
\n

\n create table #plans(plan_address varbinary(8))\n

\n
\n

\n

\n
\n

\n if (@plan_addr is null)\n

\n
\n

\n insert into #plans select memory_object_address from sys.dm_os_memory_objects\n

\n
\n

\n where type = 'MEMOBJ_COMPILE_ADHOC' and parent_address is NULL\n

\n
\n

\n else\n

\n
\n

\n insert into #plans values (@plan_addr)\n

\n
\n

\n

\n
\n

\n declare plan_cursor cursor local for select plan_address from #plans\n

\n
\n

\n open plan_cursor\n

\n
\n

\n

\n
\n

\n declare @current_plan_address varbinary(8)\n

\n
\n

\n fetch next from plan_cursor into @current_plan_address\n

\n
\n

\n

\n
\n

\n while (@@fetch_status = 0)\n

\n
\n

\n begin\n

\n
\n

\n declare @plan_handle varbinary(64)\n

\n
\n

\n declare @total_size int\n

\n
\n

\n declare @cstmt_count int\n

\n
\n

\n declare @cstmt_size int\n

\n
\n

\n declare @xstmt_count int\n

\n
\n

\n declare @xstmt_size int\n

\n
\n

\n declare @cursor_count int\n

\n
\n

\n declare @cursor_size int\n

\n
\n

\n declare @mxc_count int\n

\n
\n

\n declare @mxc_size int\n

\n
\n

\n declare @query_count int\n

\n
\n

\n declare @query_size int\n

\n
\n

\n declare @skeleton_count int\n

\n
\n

\n set @plan_handle = null;\n

\n
\n

\n set @total_size = null;\n

\n
\n

\n set @cstmt_count = 0;\n

\n
\n

\n set @cstmt_size = 0;\n

\n
\n

\n set @xstmt_count = 0;\n

\n
\n

\n set @xstmt_size = 0;\n

\n
\n

\n set @cursor_count = 0;\n

\n
\n

\n set @cursor_size = 0;\n

\n
\n

\n set @mxc_count = 0;\n

\n
\n

\n set @mxc_size = 0;\n

\n
\n

\n set @query_count = 0;\n

\n
\n

\n set @query_size = 0;\n

\n
\n

\n set @skeleton_count = 0;\n

\n
\n

\n

\n
\n

\n -- grab the plan handle and total size for the plan we're working on, if it exists\n

\n
\n

\n -- in dm_exec_cached_plans.\n

\n
\n

\n select @plan_handle = plan_handle, @total_size = size_in_bytes from\n

\n
\n

\n sys.dm_exec_cached_plans where memory_object_address = @current_plan_address\n

\n
\n

\n

\n
\n

\n select * into #plan_details from CompPlanDetails(@current_plan_address, @plan_handle)\n

\n
\n

\n

\n
\n

\n -- add the plan details to the results\n

\n
\n

\n insert into PlanDetails select * from #plan_details\n

\n
\n

\n

\n
\n

\n -- If we didn't find this plan in sys.dm_exec_cached_plans, then go ahead and compute\n

\n
\n

\n -- the total_size by aggregating the pages used of all the top-level pmo's in the plan.\n

\n
\n

\n -- This really should be an accurate accounting of the plan memory usage too.\n

\n
\n

\n if (@plan_handle is null)\n

\n
\n

\n select @total_size = sum(pages_allocated_count * page_size_in_bytes) from #plan_details\n

\n
\n

\n where parent_address is null\n

\n
\n

\n

\n
\n

\n -- form the summary information for the given plan.\n

\n
\n

\n declare detail_cursor cursor local for\n

\n
\n

\n select type, pages_allocated_count, page_size_in_bytes from #plan_details\n

\n
\n

\n open detail_cursor\n

\n
\n

\n

\n
\n

\n declare @type varchar(256)\n

\n
\n

\n declare @pages int\n

\n
\n

\n declare @page_size int\n

\n
\n

\n

\n
\n

\n fetch next from detail_cursor into @type, @pages, @page_size\n

\n
\n

\n

\n
\n

\n while (@@fetch_status = 0)\n

\n
\n

\n begin\n

\n
\n

\n if (@type = 'MEMOBJ_XSTMT')\n

\n
\n

\n begin\n

\n
\n

\n set @xstmt_count = @xstmt_count + 1\n

\n
\n

\n set @xstmt_size = @xstmt_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_EXECUTE')\n

\n
\n

\n begin\n

\n
\n

\n set @mxc_count = @mxc_count + 1\n

\n
\n

\n set @mxc_size = @mxc_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_STATEMENT')\n

\n
\n

\n begin\n

\n
\n

\n set @cstmt_count = @cstmt_count + 1\n

\n
\n

\n set @cstmt_size = @cstmt_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_CURSOREXEC')\n

\n
\n

\n begin\n

\n
\n

\n set @cursor_count = @cursor_count + 1\n

\n
\n

\n set @cursor_size = @cursor_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_QUERYEXECCNTXTFORSE')\n

\n
\n

\n begin\n

\n
\n

\n set @query_count = @query_count + 1\n

\n
\n

\n set @query_size = @query_size + (@pages * @page_size)\n

\n
\n

\n end\n

\n
\n

\n else if (@type = 'MEMOBJ_PLANSKELETON')\n

\n
\n

\n begin\n

\n
\n

\n set @skeleton_count = @skeleton_count + 1\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n fetch next from detail_cursor into @type, @pages, @page_size\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n close detail_cursor\n

\n
\n

\n deallocate detail_cursor\n

\n
\n

\n

\n
\n

\n insert into PlanSummary values(@plan_handle, @current_plan_address, @total_size, @cstmt_count, @cstmt_size, @xstmt_count, @xstmt_size, @cursor_count, @cursor_size, @mxc_count, @mxc_size, @query_count, @query_size, @skeleton_count)\n

\n
\n

\n

\n
\n

\n drop table #plan_details\n

\n
\n

\n fetch next from plan_cursor into @current_plan_address\n

\n
\n

\n end\n

\n
\n

\n

\n
\n

\n close plan_cursor\n

\n
\n

\n deallocate plan_cursor\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n To fetch the PlanSummary and PlanDetails for the stored procedure p1 in the above example use the queries below:\n

\n
\n

\n

\n
\n

\n exec PlanBreakdown 0x040D40C0\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n -- See the summaries for each plan.\n

\n
\n

\n select * from PlanSummary\n

\n
\n

\n

\n
\n

\n -- See the details for each plan.\n

\n
\n

\n select * from PlanDetails\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Select * from PlanSummary returns one row as below: (note though that the data has been pivoted here for easy readability). The sizes reported here are in bytes.\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n plan_handle\n \n

\n
\n
\n

\n 0x05000100AB200\n

\n
\n

\n D4BB84137040000\n

\n
\n

\n 000000000000000\n

\n
\n

\n 00000\n

\n
\n
\n

\n \n memory_object_address\n \n

\n
\n
\n

\n 0x043740C0\n

\n
\n
\n

\n \n total_size\n \n

\n
\n
\n

\n 65536\n

\n
\n
\n

\n \n cstmt_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n cstmt_size\n \n

\n
\n
\n

\n 17408\n

\n
\n
\n

\n \n xstmt_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n xstmt_size\n \n

\n
\n
\n

\n 17408\n

\n
\n
\n

\n \n cursor_count\n \n

\n
\n
\n

\n 0\n

\n
\n
\n

\n \n cursor_size\n \n

\n
\n
\n

\n 0\n

\n
\n
\n

\n \n mxc_count\n \n

\n
\n
\n

\n 1\n

\n
\n
\n

\n \n mxc_size\n \n

\n
\n
\n

\n 8192\n

\n
\n
\n

\n \n query_count\n \n

\n
\n
\n

\n 2\n

\n
\n
\n

\n \n query_size\n \n

\n
\n
\n

\n 16384\n

\n
\n
\n

\n \n skeleton_count\n \n

\n
\n
\n

\n 1\n

\n
\n
\n

\n

\n
\n

\n Now lets what happens to the memory objects when a query re-compiles:\n

\n
\n

\n

\n
\n

\n Connection 1:\n

\n
\n

\n

\n
\n

\n alter table t1 add col3 int\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Connection 2:\n

\n
\n

\n

\n
\n

\n create procedure p1\n

\n
\n

\n as\n

\n
\n

\n begin\n

\n
\n

\n ---long running queries\n

\n
\n

\n select * from t1 where col1 = 5;\n

\n
\n

\n select * from t2 where col1 = 10;\n

\n
\n

\n ---long running queries\n

\n
\n

\n end\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n exec p1\n

\n
\n

\n go\n

\n
\n

\n

\n
\n

\n Execute the queries in connection 1 and 2 simultaneously. The first select query inside the stored procedure will be recompiled. Use the function CompPlanDetails to get the memory layout before executing the query in connection 1 and after executing the alter table query in connection 1. A subset of the rows returned before the query recompilation is as below:\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n \n Parent_address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4948\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLANSKELETON\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4B50\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x045A4D58\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE880\n

\n
\n

\n 7FB8415A04000000\n

\n
\n

\n 000000000000000000\n

\n
\n
\n

\n 0x04362028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n

\n
\n

\n A subset of the result set returned by function CompPlanDetails after recompilation is below. After query recompilation, notice that the plan skeleton and the CStmt memory object address has been updated, while the parent address and the plan handle remain unchanged.\n

\n
\n

\n

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n

\n \n Plan_handle\n \n

\n
\n
\n

\n \n Memory_object_address\n \n

\n
\n
\n

\n \n Parent_address\n \n

\n
\n
\n

\n \n Type\n \n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A4F60\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n PLANSKELETON\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x04362028\n

\n
\n
\n

\n NULL\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n EXECUTE\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A5168\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n 0x05000100EAE8807\n

\n
\n

\n FB8415A0400000000\n

\n
\n

\n 0000000000000000\n

\n
\n
\n

\n 0x045A4D58\n

\n
\n
\n

\n 0x045A40C0\n

\n
\n
\n

\n MEMOBJ_\n

\n
\n

\n STATEMENT\n

\n
\n
\n

\n

\n
\n

\n \n memory_layout_example.vsd\n \n

\n \n","kudosSumWeight":0,"postTime":"2019-03-23T04:46:31.878-07:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:SQLServerProgrammability","text":"SQLServerProgrammability","time":"2019-03-23T04:15:01.718-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":13,"rawTeaser":"First published on MSDN on Jan 09, 2007
table.","introduction":"","coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""},"currentRevision":{"__ref":"Revision:revision:383203_2"},"latestVersion":{"__typename":"FriendlyVersion","major":"2","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":3307},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"blogMessagePolicies":{"__typename":"BlogMessagePolicies","canDoAuthoringActionsOnBlog":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","key":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":2}},"Conversation:conversation:383203":{"__typename":"Conversation","id":"conversation:383203","solved":false,"topic":{"__ref":"BlogTopicMessage:message:383203"},"lastPostingActivityTime":"2019-03-23T04:46:34.397-07:00","lastPostTime":"2019-03-23T04:46:31.878-07:00","unreadReplyCount":0,"isSubscribed":false},"ModerationData:moderation_data:383203":{"__typename":"ModerationData","id":"moderation_data:383203","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:383203_2":{"__typename":"Revision","id":"revision:383203_2","lastEditTime":"2019-03-23T04:46:34.397-07:00"},"CachedAsset:theme:customTheme1-1745486121533":{"__typename":"CachedAsset","id":"theme:customTheme1-1745486121533","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505309750","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309750","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/blogs/BlogMessagePage:board:SQLServer-1745502712655":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/blogs/BlogMessagePage:board:SQLServer-1745502712655","value":{"id":"BlogMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"blog-article","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":"LOCKED","bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[{"id":"blogs.widget.blogArticleWidget","className":"lia-blog-container","props":null,"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"}},{"id":"section-1729184836777","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":false,"showDescription":false,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[],"side":[],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/blogs/BlogMessagePage-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-pages/blogs/BlogMessagePage-1745505309750","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This blog post cannot be found","name":"Blog Message Page","section.blog-article.title":"Blog Post","archivedMessageTitle":"This Content Has Been Archived","section.section-1729184836777.title":"","section.section-1729184836777.description":"","section.CncIde.title":"Blog Post","section.tifEmD.description":"","section.tifEmD.title":""},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1745505310233":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1745505310233","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505309750","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1745486158577","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size: 14px;\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1x9u2_1 {\n a.custom_widget_community_banner_top-bar_1x9u2_2.custom_widget_community_banner_btn_1x9u2_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size: 0.875rem;\n }\n}\n","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1x9u2_1","top-bar":"custom_widget_community_banner_top-bar_1x9u2_2","btn":"custom_widget_community_banner_btn_1x9u2_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1745486158577","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1745486158577":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1745486158577","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505309750","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745505309750","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:AI":{"__typename":"Category","id":"category:AI","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:383203:2":{"__typename":"QueryVariables","id":"TopicReplyList:message:383203:2","value":{"id":"message:383203","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505309750","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505309750","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505309750","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505309750","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505309750","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505309750","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745505309750","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745505309750","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745505309750","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505309750","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505309750","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCoverImage-1745505309750","value":{"coverImageTitle":"Cover Image"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeTitle-1745505309750","value":{"nodeTitle":"{nodeTitle, select, community {Community} other {{nodeTitle}}} "},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTimeToRead-1745505309750","value":{"minReadText":"{min} MIN READ"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505309750","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505309750","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745505309750","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505309750","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505309750","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745505309750","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1745505309750","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745505309750","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1745505309750","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505309750","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745505309750","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1745505309750","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeAvatar-1745505309750","value":{"altTitle":"Node avatar for {nodeTitle}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeDescription-1745505309750","value":{"description":"{description}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1745505309750","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309750":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745505309750","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false}}}},"page":"/blogs/BlogMessagePage/BlogMessagePage","query":{"boardId":"sqlserver","messageSubject":"1-0-structure-of-the-plan-cache-and-types-of-cached-objects","messageId":"383203"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/blogs/BlogArticleWidget/BlogArticleWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=BlogMessagePage&entity.id=board%3Asqlserver&entity.id=message%3A383203","strategy":"afterInteractive"}]}