A-Z of In-Memory OLTP : Extended Events (XEvents)
Posted by blakhani on February 18, 2014
All of us want to know “internals” of many things. Doctors want to know internals of body; Engineer wants to know internals of machines. On the same line SQL DBA always wants to know internals of SQL Server. Sometimes there are easier ways to look at internals of SQL Server via extended events as compare to any other tool available. In this blog, we would have a look at the XEvents (eXtended Events) which are available to provide information about In-Memory OLTP. If you want to learn about XEvents, then start from Jonathan’s blog series (An XEvent a Day)
To get the list of XEvents which are related to In-Memory OLTP, we can either use query or Interface. There are three packages available for XTP (Hope you have read my initial blog of series which explains XTP, if not, read here)
Name | Description |
XtpRuntime | Extended events for the XTP Runtime |
XtpCompile | Extended events for the XTP Compile |
XtpEngine | Extended events for the XTP Engine |
We can view events for Registered Packages using below queries. I have modified the one available on books online. Here is the query and the output
USE msdb SELECT p.name, c.event, k.keyword, c.channel, c.description FROM (SELECT event_package=o.package_guid, o.description, event=c.object_name, channel=v.map_value FROM sys.dm_xe_objects o LEFT JOIN sys.dm_xe_object_columns c ON o.name = c.object_name INNER JOIN sys.dm_xe_map_values v ON c.type_name = v.name AND c.column_value = Cast(v.map_key AS NVARCHAR) WHERE object_type = 'event' AND ( c.name = 'CHANNEL' OR c.name IS NULL )) c LEFT JOIN (SELECT event_package=c.object_package_guid, event=c.object_name, keyword=v.map_value FROM sys.dm_xe_object_columns c INNER JOIN sys.dm_xe_map_values v ON c.type_name = v.name AND c.column_value = v.map_key AND c.type_package_guid = v.object_package_guid INNER JOIN sys.dm_xe_objects o ON o.name = c.object_name AND o.package_guid = c.object_package_guid WHERE object_type = 'event' AND c.name = 'KEYWORD') k ON k.event_package = c.event_package AND ( k.event = c.event OR k.event IS NULL ) INNER JOIN sys.dm_xe_packages p ON p.guid = c.event_package WHERE name LIKE '%xtp%' OR c.event LIKE '%xtp%' OR c.description LIKE '%xtp%' OR k.event LIKE '%xtp%' OR k.keyword LIKE '%xtp%' ORDER BY 1, keyword DESC, channel, event
Here is the output
Name | Event | keyword | channel | description |
sqlserver | natively_compiled_proc_slow_parameter_passing | xtp | Analytic | Occurs when a Hekaton procedure call dispatch goes to slow parameter passing code path |
sqlserver | after_natively_compiled_proc_entry_removal_on_drop | xtp | Debug | Fired after the procedure cache entry is flushed when dropping a natively compiled procedure. |
sqlserver | before_natively_compiled_proc_entry_removal_on_drop | xtp | Debug | Fired before the procedure cache entry is flushed when dropping a natively compiled procedure. |
sqlserver | natively_compiled_proc_execution_started | xtp | Debug | Fired before a natively compiled procedure is executed. |
sqlserver | xtp_create_procedure | xtp | Debug | Occurs at start of XTP procedure creation. |
sqlserver | xtp_create_table | xtp | Debug | Occurs at start of XTP table creation. |
sqlserver | xtp_deploy_done | xtp | Debug | Occurs at completion of XTP object deployment. |
sqlserver | xtp_matgen | xtp | Debug | Occurs at start of MAT generation. |
sqlserver | xtp_offline_checkpoint_scan_start | xtp | Debug | Fired by XTP offline checkpoint when the checkpoint thread begins. |
sqlserver | xtp_offline_checkpoint_scan_stop | xtp | Debug | Fired by XTP offline checkpoint when the checkpoint thread stops. |
sqlserver | xtp_recover_done | xtp | Debug | Occurs at completion of log recovery of XTP table. |
sqlserver | xtp_recover_table | xtp | Debug | Occurs at start of log recovery of XTP table. |
sqlserver | xtp_storage_table_create | xtp | Debug | Occurs at just before the XTP storage table is created. |
XtpCompile | cgen | deploy | Debug | Occurs at start of C code generation. |
XtpCompile | invoke_cl | deploy | Debug | Occurs prior to the invocation of the C compiler. |
XtpCompile | mat_export | deploy | Debug | Occurs at start of MAT export. |
XtpCompile | pit_export | deploy | Debug | Occurs at start of PIT export. |
XtpCompile | pitgen_procs | deploy | Debug | Occurs at start of PIT generation for procedures. |
XtpCompile | pitgen_tables | deploy | Debug | Occurs at start of PIT generation for tables. |
XtpEngine | after_changestatetx_event | transaction | Debug | Fires after transaction changes state |
XtpEngine | alloctx_event | transaction | Debug | |
XtpEngine | attempt_committx_event | transaction | Debug | Is raised when a transaction is asked to commit |
XtpEngine | before_changestatetx_event | transaction | Debug | Fires before transaction changes state |
XtpEngine | dependency_acquiredtx_event | transaction | Debug | Raised after transaction takes a dependency on another transaction |
XtpEngine | endts_acquiredtx_event | transaction | Debug | Fires after transaction acquires an end timestamp |
XtpEngine | redo_single_hk_record | transaction | Debug | Redo on a HK log record |
XtpEngine | waiting_for_dependenciestx_event | transaction | Debug | Raised when we have explicitly waited for dependencies to clear |
XtpEngine | xtp_create_log_record | transaction | Debug | Fires when the XTP engine creates a log record. |
XtpEngine | gc_base_generation_evaluation | gc | Debug | Indicates that an evaluation of updating the GC base generation has been made. |
XtpEngine | gc_base_generation_updated | gc | Debug | Indicates that the oldest active transaction hint used for calculating the GC base generation has been updated. |
XtpEngine | gc_cycle_completed | gc | Debug | Indicates that a GC notification has been enqueued. |
XtpEngine | gc_notification | gc | Debug | Indicates that a GC notification has not being able to process a notification. |
XtpEngine | xtp_checkpoint_file_flush | checkpoint | Debug | Indicates the point at which a given file has been flushed to disk. |
XtpEngine | xtp_checkpoint_file_flush_complete | checkpoint | Debug | Indicates the point at which all in-flight buffers have been flushed to disk. |
XtpEngine | xtp_checkpoint_file_read | checkpoint | Debug | Indicates reading of a file in XTP checkpoint recovery. |
XtpEngine | xtp_checkpoint_write_io | checkpoint | Debug | Indicates that the checkpointing subsystem has issued or completed a write IO. |
XtpEngine | xtp_root_deserialized | checkpoint | Debug | Indicates that the load of a checkpoint root is complete. |
XtpEngine | xtp_root_serialized | checkpoint | Debug | Indicates that the write of the checkpoint root is complete. |
XtpRuntime | bind_md | deploy | Debug | Occurs prior to binding metadata for a memory optimized table. |
XtpRuntime | bind_tables | deploy | Debug | Occurs prior to binding tables for a natively compiled procedure. |
XtpRuntime | create_table | deploy | Debug | Occurs prior to creating memory optimized table. |
XtpRuntime | deserialize_md | deploy | Debug | Occurs prior to deserializing metadata. |
XtpRuntime | load_dll | deploy | Debug | Occurs prior to loading the generated DLL. |
XtpRuntime | recover_done | deploy | Debug | Occurs at completion of checkpoint recovery of a memory optimized table. |
XtpRuntime | recover_table | deploy | Debug | Occurs at start of checkpoint recovery of a memory optimized table. |
XtpRuntime | serialize_md | deploy | Debug | Occurs prior to serializing metadata. |
This output shows something interesting. Notice that most of the events are under “Debug” Channel. This means, if we would go to wizard of creation of XEvent session in SSMS, we would not see them because Debug channel is not checked by default.
After checking Debug, we should be able to see the events. In below, I have put filter of work XTP.
Let’s use XEvent to understand a concept. We have learned that DLLs of table is loaded as soon as database is started whereas the stored procedure DLL is loaded when its first executed. We have already discussed this concepts in Behind the Scenes
To demonstrate, I have created below XEvent Session. My database already has table and natively compiled stored procedure.
CREATE EVENT SESSION [SQLServerHelp] ON SERVER ADD EVENT sqlserver.database_started (ACTION(sqlos.cpu_id, sqlserver.database_id) WHERE ([database_id] = (5))) ,ADD EVENT XtpRuntime.load_dll (ACTION(sqlos.cpu_id, sqlserver.client_hostname)) ADD TARGET package0.event_file (SET filename = N'SQLServerHelp') WITH ( MAX_MEMORY = 4096 KB ,EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,MAX_DISPATCH_LATENCY = 30 SECONDS ,MAX_EVENT_SIZE = 0 KB ,MEMORY_PARTITION_MODE = NONE ,TRACK_CAUSALITY = OFF ,STARTUP_STATE = ON ) GO
I have put filter on database_id = 5 which you may want to change based on your system. After creating the session, I restarted SQL Server and after some time I executed stored procedure as well. As we can see in below that table DLL is loaded before database startup was complete.
Also notice that stored procedure DLL was loaded when I have manually executed stored procedure. Wow! extended events have confirmed our learning about DLLs generation and loading.
Conclusion
There are various extended events which can help us understand internals of hekaton / In-Memory OLTP. We will try to use more and see practical of theory which we have learned so far in this A-Z Series.
Hope you have learned something new today!
Leave a Reply