I was exploring this week the Microsoft Fabric Warehouse and I observed that there're three views available under the queryinsight schema: exec_requests_history, frequently_run_queries and long_running_queries, According to their definitions, they are based on two database objects fabric_query_starting and fabric_query_completed that cannot be called directly.
Announced in the Nov-2023 update, the Query Insights (QI) feature is a "scalable, sustainable, and extendable solution to enhance the SQL analytics experience" (see Microsoft's documentation).
Strangely, the three views appear in the Model view together with the objects defined in the dbo or other user-defined schemas. One can hide the queryinsight objects, however doing this operation in each model is impractical, especially when the number of the objects defined in the respective schema will increase in time. On the other side, the respective objects might be useful in building a report for visualizing query's performance. (Probably, a multi-model solution would and/or further settings will allow more flexibility.)
Secondly, the objects from the queryinsight schema are not available in the sys.objects DMV:
SELECT top 10 * FROM sys.objects WHERE name LIKE 'fabric%'
The exec_requests_history DMV (similar to the dm_exec_requests_history DMV from the standard SQL Server) references several DMVs, and it would be useful to retrieve the corresponding information within the same query:
-- fabric warehouse SELECT erh.distributed_statement_id , erh.start_time , erh.end_time , erh.total_elapsed_time_ms --, erh.login_name , erh.row_count , erh.status , erh.session_id , erh.connection_id , erh.program_name , erh.batch_id , erh.root_batch_id , erh.query_hash , erh.command FROM queryinsights.exec_requests_history erh WHERE status = 'Succeeded'--'Failed'
However, attempting to retrieve session information via the sys.dm_exec_sessions DMV leads to the below error message:
SELECT * FROM queryinsights.exec_requests_history erh LEFT JOIN sys.dm_exec_sessions ses ON erh.session_id = ses.session_id WHERE erh.status = 'Succeeded'--'Failed'
The query references an object that is not supported in distributed processing mode.
Msg 15816, Level 16, State 7, Code line 11
Using the standard SQL Sever system functions seem to work, as long the view from the queryinsights schema is not considered:
According to the documentation, "Some objects, like system views, and functions can't be used while you query data stored in Azure Data Lake or Azure Cosmos DB analytical storage. Avoid using the queries that join external data with system views, load external data in a temp table, or use some security or metadata functions to filter external data."-- dropping the temp table --DROP TABLE IF EXISTS dbo.#requests_history; -- create the temp table CREATE TABLE dbo.#requests_history ( distributed_statement_id uniqueidentifier , start_time datetime2(6) , end_time datetime2(6) , total_elapsed_time_ms bigint , login_name varchar(255) , row_count bigint , status varchar(50) , session_id bigint , connection_id uniqueidentifier , program_name varchar(255) , batch_id uniqueidentifier , root_batch_id uniqueidentifier , query_hash uniqueidentifier , command varchar(max) ) -- inserting a few records INSERT INTO dbo.#requests_history SELECT erh.distributed_statement_id , erh.start_time , erh.end_time , erh.total_elapsed_time_ms , erh.login_name , erh.row_count , erh.status , erh.session_id , erh.connection_id , erh.program_name , erh.batch_id , erh.root_batch_id , erh.query_hash , erh.command FROM queryinsights.exec_requests_history erh; -- retrieve the inserted records SELECT * FROM dbo.#requests_history;
Please note that the values are case sensitive and only a subset of the standard data types are supported (see documentation).
You might want to check also the queries from the SQL Server System Catalog.
Happy coding!
No comments:
Post a Comment