├── MI-GP-storage-perf └── MI-GP-storage-perf.sql ├── README.md ├── perf-counters └── perf-counters-mi.sql ├── resource_stats ├── mi_server_resource_stats.sql └── real_time_resource_stats.sql └── sp_readmierrorlog └── sp_readmierrorlog.sql /MI-GP-storage-perf/MI-GP-storage-perf.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This script is intended to be executed on Azure SQL Database Managed Instance (General Purpose) 3 | to determine if the IOPS/throughput seen against each database file in remote storage during script 4 | execution are near Azure Premium Storage limits for the blob corresponding to the file. 5 | 6 | The script helps in determining if using larger files/blobs with higher limits 7 | would be beneficial for improving workload performance. 8 | 9 | NOTE: This script reports IOPS as they are measured by SQL Server. Azure Premium Storage measures 10 | them differently. For IOs up to 256 KB, both measurements match. For larger IOs, Azure Premium Storage 11 | breaks each IO into 256 KB chunks, and counts each chunk as an IO. Therefore, if SQL Server issues 12 | IOs larger than 256 KB, e.g. during backup/restore, then IOPS reported by this script will be lower 13 | than the IOPS measured by Azure Premium Storage. In this case, IOPS-based throttling could be 14 | occurring even if not reported in the script output. 15 | */ 16 | 17 | SET NOCOUNT ON; 18 | 19 | BEGIN TRY 20 | 21 | -- Begin parameters section 22 | 23 | -- Change sampling loop duration to collect data over a representative time interval 24 | DECLARE @LoopDurationSeconds int = 30; 25 | 26 | -- Change the length of the interval between samplings of sys.dm_io_virtual_file_stats() for more or less granular sampling 27 | DECLARE @IntervalLengthMilliseconds int = 1000; 28 | 29 | -- End parameters section 30 | 31 | IF @IntervalLengthMilliseconds < 100 32 | THROW 50001, 'The minimum supported sampling interval duration is 100 ms.', 1; 33 | 34 | DECLARE @StartDateTime datetime2(2) = SYSDATETIME(); 35 | DECLARE @DelayInterval varchar(12) = DATEADD(millisecond, @IntervalLengthMilliseconds, CAST('00:00:00' AS time(3))); 36 | DECLARE @VFSSample TABLE ( 37 | SampleMs bigint NOT NULL, 38 | DatabaseID smallint NOT NULL, 39 | FileID smallint NOT NULL, 40 | TransferCount bigint NOT NULL, 41 | ByteCount bigint NOT NULL, 42 | PRIMARY KEY (SampleMs, DatabaseID, FileID) 43 | ); 44 | 45 | -- Collect samples of virtual file stats for the specified duration 46 | WHILE SYSDATETIME() < DATEADD(second, @LoopDurationSeconds, @StartDateTime) 47 | BEGIN 48 | INSERT INTO @VFSSample 49 | ( 50 | SampleMs, 51 | DatabaseID, 52 | FileID, 53 | TransferCount, 54 | ByteCount 55 | ) 56 | SELECT vfs.sample_ms AS SampleMs, 57 | vfs.database_id AS DatabaseID, 58 | vfs.file_id AS FileID, 59 | vfs.num_of_reads + vfs.num_of_writes AS TransferCount, 60 | vfs.num_of_bytes_read + vfs.num_of_bytes_written AS ByteCount 61 | FROM sys.dm_io_virtual_file_stats(default, default) AS vfs 62 | WHERE vfs.database_id NOT IN (2,32760,32761,32762,32763) -- Exclude databases on local storage 63 | ; 64 | 65 | WAITFOR DELAY @DelayInterval; 66 | END; 67 | 68 | -- Return result set. 69 | -- Each row represents a database file, and includes max IOPS/throughput seen against the file, 70 | -- as well as counters showing how many times file IOPS/throughput were near Premium Storage limits during sampling loop execution. 71 | WITH 72 | -- Define Azure Premium Storage limits (https://docs.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#premium-storage-disk-limits) 73 | BlobLimit AS 74 | ( 75 | SELECT 129 AS BlobSizeGB, 500 AS IOPSLimit, 100 AS ThroughputLimit 76 | UNION 77 | SELECT 513, 2300, 150 78 | UNION 79 | SELECT 1025, 5000, 200 80 | UNION 81 | SELECT 2049, 7500, 250 82 | UNION 83 | SELECT 4097, 7500, 250 84 | UNION 85 | SELECT 8192, 12500, 480 86 | ), 87 | -- Calculate IOPS/throughput per file for each sampling interval, 88 | -- by subtracting the cumulative stats of the previous sample 89 | -- from the cumulative stats of the next sample. 90 | IntervalPerfMeasure AS 91 | ( 92 | SELECT s.DatabaseID, 93 | s.FileID, 94 | s.SampleMs, 95 | (LEAD(s.TransferCount, 1) OVER (PARTITION BY s.DatabaseID, s.FileID ORDER BY s.SampleMs) - s.TransferCount) 96 | * 97 | (1000. / (LEAD(s.SampleMs, 1) OVER (PARTITION BY s.DatabaseID, s.FileID ORDER BY s.SampleMs) - s.SampleMs)) 98 | AS IntervalIOPS, 99 | ( 100 | (LEAD(s.ByteCount, 1) OVER (PARTITION BY s.DatabaseID, s.FileID ORDER BY s.SampleMs) - s.ByteCount) 101 | / 102 | ((LEAD(s.SampleMs, 1) OVER (PARTITION BY s.DatabaseID, s.FileID ORDER BY s.SampleMs) - s.SampleMs) * 0.001) 103 | ) 104 | / 1024 / 1024 105 | AS IntervalThroughput -- In MB/s 106 | FROM @VFSSample AS s 107 | ), 108 | -- Add columns for database name, file names, and file size 109 | FilePerfMeasure AS 110 | ( 111 | SELECT DB_NAME(mf.database_id) AS DatabaseName, 112 | mf.name AS FileLogicalName, 113 | mf.physical_name AS FilePhysicalName, 114 | CAST(mf.size * 8. / 1024 / 1024 AS decimal(12,4)) AS FileSizeGB, 115 | ipm.SampleMs, 116 | CAST(ipm.IntervalIOPS AS decimal(12,2)) AS IntervalIOPS, 117 | CAST(ipm.IntervalThroughput AS decimal(12,2)) AS IntervalThroughput 118 | FROM IntervalPerfMeasure AS ipm 119 | INNER JOIN sys.master_files AS mf 120 | ON ipm.DatabaseID = mf.database_id 121 | AND 122 | ipm.FileID = mf.file_id 123 | WHERE -- Remove rows without corresponding next sample 124 | ipm.IntervalIOPS IS NOT NULL 125 | AND 126 | ipm.IntervalThroughput IS NOT NULL 127 | ) 128 | SELECT fpm.DatabaseName, 129 | fpm.FileLogicalName, 130 | fpm.FilePhysicalName, 131 | fpm.FileSizeGB, 132 | bl.BlobSizeGB, 133 | bl.IOPSLimit, 134 | MAX(fpm.IntervalIOPS) AS MaxIOPS, 135 | SUM(IIF(fpm.IntervalIOPS >= bl.IOPSLimit * 0.9, 1, 0)) AS IOPSNearLimitCount, 136 | bl.ThroughputLimit AS ThroughputLimitMBPS, 137 | MAX(fpm.IntervalThroughput) AS MaxThroughputMBPS, 138 | SUM(IIF(fpm.IntervalThroughput >= bl.ThroughputLimit * 0.9, 1, 0)) AS ThroughputNearLimitCount 139 | FROM FilePerfMeasure AS fpm 140 | CROSS APPLY ( 141 | SELECT TOP (1) bl.BlobSizeGB, 142 | bl.IOPSLimit, 143 | bl.ThroughputLimit 144 | FROM BlobLimit AS bl 145 | WHERE bl.BlobSizeGB >= fpm.FileSizeGB 146 | ORDER BY bl.BlobSizeGB 147 | ) AS bl 148 | GROUP BY fpm.DatabaseName, 149 | fpm.FileLogicalName, 150 | fpm.FilePhysicalName, 151 | fpm.FileSizeGB, 152 | bl.BlobSizeGB, 153 | bl.IOPSLimit, 154 | bl.ThroughputLimit 155 | ; 156 | 157 | END TRY 158 | BEGIN CATCH 159 | THROW; 160 | END CATCH; 161 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Managed Instance code samples 3 | This is a repository of code samples to use with Azure SQL Database Managed Instance (MI). 4 | 5 | 1. sp_readmierrorlog.sql is a stored procedure that provides a filtered and more readable version of the MI error log. 6 | 2. perf-counters-mi.sql is a script that collects performance counters on MI. 7 | 3. MIGP_storage_perf_limits.sql is a script that examines IOPS/throughput per database file over a period of time on MI General Purpose, and compares them against Azure Premium Storage limits. The script helps in determining if using larger files/blobs with higher limits would be beneficial for improving workload performance. 8 | 4. mi_server_resource_stats.sql is a script that creates a view named dbo.server_resource_stats. This view provides real-time resource stats for an MI instance, as a workaround for commonly observed data latency in the sys.server_resource_stats view. 9 | 5. real_time_resource_stats.sql is a query that returns real-time resource stats for an instance. It is an alternative to sys.server_resource_stats, providing another workaround for commonly observed data latency when using that view. 10 | -------------------------------------------------------------------------------- /perf-counters/perf-counters-mi.sql: -------------------------------------------------------------------------------- 1 | /* 2 | DESCRIPTION: 3 | This script provides SQL performance counter values based on data in sys.dm_os_performance_counters DMV. 4 | It is intended to be used for Azure SQL Database Managed Instance performance monitoring and diagnostic data collection, 5 | where the traditional methods of collecting PerfMon data are not available. 6 | The script will execute for the specified number of iterations, which can be set to a large number for 7 | a quasi-indefinite capture similar to default PerfMon behavior. At the beginning of each iteration, a 8 | snapshot of cumulative counters is taken, followed by a wait interval, and then by a second snapshot. 9 | At that time, counter values are recorded in the dbo.perf_counter_log table, and a new iteration starts. 10 | 11 | USAGE: 12 | 1. Set the @SnapshotIntervalSeconds and @MaxIterationCount parameters. Optionally, edit the script to define the counters to be collected. 13 | 2. Run the script. 14 | 3. Collected data will be found in dbo.perf_counter_log table in the current database. 15 | */ 16 | 17 | -- External parameters 18 | DECLARE @SnapshotIntervalSeconds int = 10; -- The interval between first and second snapshot during each iteration 19 | DECLARE @MaxIterationCount int = 100000; -- The number of iterations. Use a large number for indefinite capture duration. 20 | DECLARE @SourceCounter table ( 21 |                              object_name nvarchar(128) not null, 22 |                              counter_name nvarchar(128) not null, 23 |                              instance_name nvarchar(128) not null, 24 |                              base_counter_name nvarchar(128) null, 25 |                              PRIMARY KEY (object_name, counter_name, instance_name) 26 |                              ); -- The set of collected counters, to be defined below 27 | -- Internal variables 28 | DECLARE @Delay char(8); 29 | DECLARE @IterationNumber int = 1; 30 | DECLARE @FirstSnapshotCounter table ( 31 |                                     object_name nchar(128) not null, 32 |                                     counter_name nchar(128) not null, 33 |                                     instance_name nchar(128) not null, 34 |                                     cntr_value bigint not null, 35 |                                     base_cntr_value bigint null 36 |                                     ); 37 | IF NOT (@SnapshotIntervalSeconds BETWEEN 1 AND 86399) -- 1 second to 23h 59m 59s 38 |     THROW 50001, 'Snapshot interval duration is outside of supported range.', 1; 39 | SET NOCOUNT ON; 40 | -- Define the counters to be collected. Edit the statement below to add/remove counters as needed. 41 | -- Two special cases for instance_name: 42 | -- 1. matches any instance name that starts with a GUID, which typically refers to a physical database name (physical_database_name in sys.databases) 43 | -- 2. <* !_Total> matches any instance name other than "_Total" 44 | INSERT INTO @SourceCounter (object_name, counter_name, instance_name, base_counter_name) 45 | SELECT 'Access Methods' AS object_name, 'Forwarded Records/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 46 | SELECT 'Access Methods' AS object_name, 'Full Scans/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 47 | SELECT 'Access Methods' AS object_name, 'Page Splits/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 48 | SELECT 'Access Methods' AS object_name, 'Pages Allocated/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 49 | SELECT 'Access Methods' AS object_name, 'Table Lock Escalations/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 50 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000000ms & <000001ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 51 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000000ms & <000001ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 52 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000000ms & <000001ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 53 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000000ms & <000001ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 54 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000001ms & <000002ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 55 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000001ms & <000002ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 56 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000001ms & <000002ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 57 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000001ms & <000002ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 58 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000002ms & <000005ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 59 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000002ms & <000005ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 60 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000002ms & <000005ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 61 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000002ms & <000005ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 62 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000005ms & <000010ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 63 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000005ms & <000010ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 64 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000005ms & <000010ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 65 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000005ms & <000010ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 66 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000010ms & <000020ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 67 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000010ms & <000020ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 68 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000010ms & <000020ms' AS counter_name, 'Elappsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 69 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000010ms & <000020ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 70 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000020ms & <000050ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 71 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000020ms & <000050ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 72 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000020ms & <000050ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 73 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000020ms & <000050ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 74 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000050ms & <000100ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 75 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000050ms & <000100ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 76 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000050ms & <000100ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 77 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000050ms & <000100ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 78 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000100ms & <000200ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 79 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000100ms & <000200ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 80 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000100ms & <000200ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 81 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000100ms & <000200ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 82 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000200ms & <000500ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 83 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000200ms & <000500ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 84 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000200ms & <000500ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 85 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000200ms & <000500ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 86 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000500ms & <001000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 87 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000500ms & <001000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 88 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000500ms & <001000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 89 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=000500ms & <001000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 90 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=001000ms & <002000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 91 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=001000ms & <002000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 92 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=001000ms & <002000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 93 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=001000ms & <002000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 94 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=002000ms & <005000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 95 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=002000ms & <005000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 96 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=002000ms & <005000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 97 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=002000ms & <005000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 98 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=005000ms & <010000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 99 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=005000ms & <010000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 100 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=005000ms & <010000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 101 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=005000ms & <010000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 102 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=010000ms & <020000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 103 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=010000ms & <020000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 104 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=010000ms & <020000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 105 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=010000ms & <020000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 106 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=020000ms & <050000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 107 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=020000ms & <050000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 108 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=020000ms & <050000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 109 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=020000ms & <050000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 110 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=050000ms & <100000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 111 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=050000ms & <100000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 112 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=050000ms & <100000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 113 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=050000ms & <100000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 114 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=100000ms' AS counter_name, 'CPU Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 115 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=100000ms' AS counter_name, 'CPU Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 116 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=100000ms' AS counter_name, 'Elapsed Time:Requests' AS instance_name, NULL AS base_counter_name UNION ALL 117 | SELECT 'Batch Resp Statistics' AS object_name, 'Batches >=100000ms' AS counter_name, 'Elapsed Time:Total(ms)' AS instance_name, NULL AS base_counter_name UNION ALL 118 | SELECT 'Buffer Manager' AS object_name, 'Background writer pages/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 119 | SELECT 'Buffer Manager' AS object_name, 'Buffer cache hit ratio' AS counter_name, '' AS instance_name, 'Buffer cache hit ratio base' AS base_counter_name UNION ALL 120 | SELECT 'Buffer Manager' AS object_name, 'Buffer cache hit ratio base' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 121 | SELECT 'Buffer Manager' AS object_name, 'Checkpoint pages/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 122 | SELECT 'Buffer Manager' AS object_name, 'Lazy writes/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 123 | SELECT 'Buffer Manager' AS object_name, 'Page life expectancy' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 124 | SELECT 'Database Replica' AS object_name, 'File Bytes Received/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 125 | SELECT 'Database Replica' AS object_name, 'Log Bytes Received/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 126 | SELECT 'Database Replica' AS object_name, 'Log remaining for undo' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 127 | SELECT 'Database Replica' AS object_name, 'Log Send Queue' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 128 | SELECT 'Database Replica' AS object_name, 'Mirrored Write Transactions/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 129 | SELECT 'Database Replica' AS object_name, 'Recovery Queue' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 130 | SELECT 'Database Replica' AS object_name, 'Redo blocked/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 131 | SELECT 'Database Replica' AS object_name, 'Redo Bytes Remaining' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 132 | SELECT 'Database Replica' AS object_name, 'Redone Bytes/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 133 | SELECT 'Database Replica' AS object_name, 'Total Log requiring undo' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 134 | SELECT 'Database Replica' AS object_name, 'Transaction Delay' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 135 | SELECT 'Databases' AS object_name, 'Checkpoint duration' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 136 | SELECT 'Databases' AS object_name, 'Checkpoint duration' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 137 | SELECT 'Databases' AS object_name, 'Group Commit Time/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 138 | SELECT 'Databases' AS object_name, 'Group Commit Time/sec' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 139 | SELECT 'Databases' AS object_name, 'Log Bytes Flushed/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 140 | SELECT 'Databases' AS object_name, 'Log Bytes Flushed/sec' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 141 | SELECT 'Databases' AS object_name, 'Log Flush Waits/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 142 | SELECT 'Databases' AS object_name, 'Log Flush Waits/sec' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 143 | SELECT 'Databases' AS object_name, 'Log Flushes/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 144 | SELECT 'Databases' AS object_name, 'Log Flushes/sec' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 145 | SELECT 'Databases' AS object_name, 'Log Growths' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 146 | SELECT 'Databases' AS object_name, 'Log Growths' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 147 | SELECT 'Databases' AS object_name, 'Percent Log Used' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 148 | SELECT 'Databases' AS object_name, 'Percent Log Used' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 149 | SELECT 'Databases' AS object_name, 'Transactions/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 150 | SELECT 'Databases' AS object_name, 'Transactions/sec' AS counter_name, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 151 | SELECT 'Databases' AS object_name, 'Write Transactions/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 152 | SELECT 'Databases' AS object_name, 'Write Transactions/sec' AS counter_namme, 'tempdb' AS instance_name, NULL AS base_counter_name UNION ALL 153 | SELECT 'General Statistics' AS object_name, 'Active Temp Tables' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 154 | SELECT 'General Statistics' AS object_name, 'Logical Connections' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 155 | SELECT 'General Statistics' AS object_name, 'Logins/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 156 | SELECT 'General Statistics' AS object_name, 'Logouts/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 157 | SELECT 'General Statistics' AS object_name, 'Processes blocked' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 158 | SELECT 'General Statistics' AS object_name, 'User Connections' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 159 | SELECT 'Locks' AS object_name, 'Average Wait Time (ms)' AS counter_name, '_Total' AS instance_name, 'Average Wait Time Base' AS base_counter_name UNION ALL 160 | SELECT 'Locks' AS object_name, 'Average Wait Time Base' AS counter_name, '_Total' AS instance_name, NULL AS base_counter_name UNION ALL 161 | SELECT 'Locks' AS object_name, 'Lock Timeouts (timeout > 0)/sec' AS counter_name, '_Total' AS instance_name, NULL AS base_counter_name UNION ALL 162 | SELECT 'Locks' AS object_name, 'Number of Deadlocks/sec' AS counter_name, '_Total' AS instance_name, NULL AS base_counter_name UNION ALL 163 | SELECT 'Memory Manager' AS object_name, 'Memory Grants Outstanding' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 164 | SELECT 'Memory Manager' AS object_name, 'Memory Grants Pending' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 165 | SELECT 'Memory Manager' AS object_name, 'SQL Cache Memory (KB)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 166 | SELECT 'Memory Manager' AS object_name, 'Stolen Server Memory (KB)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 167 | SELECT 'Memory Manager' AS object_name, 'Target Server Memory (KB)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 168 | SELECT 'Memory Manager' AS object_name, 'Total Server Memory (KB)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 169 | SELECT 'Plan Cache' AS object_name, 'Cache Hit Ratio' AS counter_name, '_Total' AS instance_name, 'Cache Hit Ratio Base' AS base_counter_name UNION ALL 170 | SELECT 'Plan Cache' AS object_name, 'Cache Hit Ratio Base' AS counter_name, '_Total' AS instance_name, NULL AS base_counter_name UNION ALL 171 | SELECT 'Plan Cache' AS object_name, 'Cache Object Counts' AS counter_name, '_Total' AS instance_name, NULL AS base_counter_name UNION ALL 172 | SELECT 'Resource Pool Stats' AS object_name, 'Active memory grant amount (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 173 | SELECT 'Resource Pool Stats' AS object_name, 'Active memory grants count' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 174 | SELECT 'Resource Pool Stats' AS object_name, 'Avg Disk Read IO (ms)' AS counter_name, 'default' AS instance_name, 'Avg Disk Read IO (ms) Base' AS base_counter_name UNION ALL 175 | SELECT 'Resource Pool Stats' AS object_name, 'Avg Disk Read IO (ms) Base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 176 | SELECT 'Resource Pool Stats' AS object_name, 'Avg Disk Write IO (ms)' AS counter_name, 'default' AS instance_name, 'Avg Disk Write IO (ms) Base' AS base_counter_name UNION ALL 177 | SELECT 'Resource Pool Stats' AS object_name, 'Avg Disk Write IO (ms) Base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 178 | SELECT 'Resource Pool Stats' AS object_name, 'Cache memory target (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 179 | SELECT 'Resource Pool Stats' AS object_name, 'Compile memory target (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 180 | SELECT 'Resource Pool Stats' AS object_name, 'CPU control effect %' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 181 | SELECT 'Resource Pool Stats' AS object_name, 'CPU delayed %' AS counter_name, 'default' AS instance_name, 'CPU delayed % base' AS base_counter_name UNION ALL 182 | SELECT 'Resource Pool Stats' AS object_name, 'CPU delayed % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 183 | SELECT 'Resource Pool Stats' AS object_name, 'CPU effective %' AS counter_name, 'default' AS instance_name, 'CPU effective % base' AS base_counter_name UNION ALL 184 | SELECT 'Resource Pool Stats' AS object_name, 'CPU effective % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 185 | SELECT 'Resource Pool Stats' AS object_name, 'CPU usage %' AS counter_name, 'default' AS instance_name, 'CPU usage % base' AS base_counter_name UNION ALL 186 | SELECT 'Resource Pool Stats' AS object_name, 'CPU usage % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 187 | SELECT 'Resource Pool Stats' AS object_name, 'CPU usage target %' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 188 | SELECT 'Resource Pool Stats' AS object_name, 'CPU violated %' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 189 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Read Bytes/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 190 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Read IO Throttled/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 191 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Read IO/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 192 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Write Bytes/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 193 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Write IO Throttled/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 194 | SELECT 'Resource Pool Stats' AS object_name, 'Disk Write IO/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 195 | SELECT 'Resource Pool Stats' AS object_name, 'Max memory (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 196 | SELECT 'Resource Pool Stats' AS object_name, 'Memory grant timeouts/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 197 | SELECT 'Resource Pool Stats' AS object_name, 'Memory grants/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 198 | SELECT 'Resource Pool Stats' AS object_name, 'Pending memory grants count' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 199 | SELECT 'Resource Pool Stats' AS object_name, 'Query exec memory target (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 200 | SELECT 'Resource Pool Stats' AS object_name, 'Target memory (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 201 | SELECT 'Resource Pool Stats' AS object_name, 'Used memory (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 202 | SELECT 'SQL Errors' AS object_name, 'Errors/sec' AS counter_name, 'DB Offline Errors' AS instance_name, NULL AS base_counter_name UNION ALL 203 | SELECT 'SQL Errors' AS object_name, 'Errors/sec' AS counter_name, 'Kill Connection Errors' AS instance_name, NULL AS base_counter_name UNION ALL 204 | SELECT 'SQL Errors' AS object_name, 'Errors/sec' AS counter_name, 'User Errors' AS instance_name, NULL AS base_counter_name UNION ALL 205 | SELECT 'SQL Statistics' AS object_name, 'Batch Requests/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 206 | SELECT 'SQL Statistics' AS object_name, 'Failed Auto-Params/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 207 | SELECT 'SQL Statistics' AS object_name, 'SQL Attention rate' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 208 | SELECT 'SQL Statistics' AS object_name, 'SQL Compilations/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 209 | SELECT 'SQL Statistics' AS object_name, 'SQL Re-Compilations/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 210 | SELECT 'Transactions' AS object_name, 'Longest Transaction Running Time' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 211 | SELECT 'Transactions' AS object_name, 'Version Cleanup rate (KB/s)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 212 | SELECT 'Transactions' AS object_name, 'Version Generation rate (KB/s)' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 213 | SELECT 'Wait Statistics' AS object_name, 'Lock waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 214 | SELECT 'Wait Statistics' AS object_name, 'Memory grant queue waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 215 | SELECT 'Wait Statistics' AS object_name, 'Network IO waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 216 | SELECT 'Wait Statistics' AS object_name, 'Non-Page latch waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 217 | SELECT 'Wait Statistics' AS object_name, 'Page IO latch waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 218 | SELECT 'Wait Statistics' AS object_name, 'Page latch waits' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 219 | SELECT 'Wait Statistics' AS object_name, 'Wait for the worker' AS counter_name, 'Cumulative wait time (ms) per second' AS instance_name, NULL AS base_counter_name UNION ALL 220 | SELECT 'Workload Group Stats' AS object_name, 'Active parallel threads' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 221 | SELECT 'Workload Group Stats' AS object_name, 'Active requests' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 222 | SELECT 'Workload Group Stats' AS object_name, 'Avg Disk msec/Read' AS counter_name, 'default' AS instance_name, 'Disk msec/Read Base' AS base_counter_name UNION ALL 223 | SELECT 'Workload Group Stats' AS object_name, 'Avg Disk msec/Write' AS counter_name, 'default' AS instance_name, 'Disk msec/Write Base' AS base_counter_name UNION ALL 224 | SELECT 'Workload Group Stats' AS object_name, 'Blocked tasks' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 225 | SELECT 'Workload Group Stats' AS object_name, 'CPU delayed %' AS counter_name, 'default' AS instance_name, 'CPU delayed % base' AS base_counter_name UNION ALL 226 | SELECT 'Workload Group Stats' AS object_name, 'CPU delayed % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 227 | SELECT 'Workload Group Stats' AS object_name, 'CPU effective %' AS counter_name, 'default' AS instance_name, 'CPU effective % base' AS base_counter_name UNION ALL 228 | SELECT 'Workload Group Stats' AS object_name, 'CPU effective % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 229 | SELECT 'Workload Group Stats' AS object_name, 'CPU usage %' AS counter_name, 'default' AS instance_name, 'CPU usage % base' AS base_counter_name UNION ALL 230 | SELECT 'Workload Group Stats' AS object_name, 'CPU usage % base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 231 | SELECT 'Workload Group Stats' AS object_name, 'CPU violated %' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 232 | SELECT 'Workload Group Stats' AS object_name, 'Disk Read Bytes/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 233 | SELECT 'Workload Group Stats' AS object_name, 'Disk Reads/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 234 | SELECT 'Workload Group Stats' AS object_name, 'Disk Violations/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 235 | SELECT 'Workload Group Stats' AS object_name, 'Disk Write Bytes/sec' AS coounter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 236 | SELECT 'Workload Group Stats' AS object_name, 'Disk Writes/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 237 | SELECT 'Workload Group Stats' AS object_name, 'Max request cpu time (ms)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 238 | SELECT 'Workload Group Stats' AS object_name, 'Max request memory grant (KB)' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 239 | SELECT 'Workload Group Stats' AS object_name, 'Query optimizations/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 240 | SELECT 'Workload Group Stats' AS object_name, 'Queued requests' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 241 | SELECT 'Workload Group Stats' AS object_name, 'Reduced memory grants/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 242 | SELECT 'Workload Group Stats' AS object_name, 'Requests completed/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 243 | SELECT 'Workload Group Stats' AS object_name, 'Suboptimal plans/sec' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 244 | SELECT 'Workload Group Stats' AS object_name, 'Disk msec/Read Base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 245 | SELECT 'Workload Group Stats' AS object_name, 'Disk msec/Write Base' AS counter_name, 'default' AS instance_name, NULL AS base_counter_name UNION ALL 246 | SELECT 'Availability Replica' AS object_name, 'Bytes Received from Replica/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 247 | SELECT 'Availability Replica' AS object_name, 'Bytes Sent to Replica/sec' AS counter_name, '' AS instance_name, NULL AS base_counter_name UNION ALL 248 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Read' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. Bytes/Read BASE' AS base_counter_name UNION ALL 249 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Read BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 250 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Transfer' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. Bytes/Transfer BASE' AS base_counter_name UNION ALL 251 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Transfer BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 252 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Write' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. Bytes/Write BASE' AS base_counter_name UNION ALL 253 | SELECT 'HTTP Storage' AS object_name, 'Avg. Bytes/Write BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 254 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Read' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. microsec/Read BASE' AS base_counter_name UNION ALL 255 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Read BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 256 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Read Comp' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. microsec/Read Comp BASE' AS base_counter_name UNION ALL 257 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Read Comp BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 258 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Transfer' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. microsec/Transfer BASE' AS base_counter_name UNION ALL 259 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Transfer BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 260 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Write' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. microsec/Write BASE' AS base_counter_name UNION ALL 261 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Write BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 262 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Write Comp' AS counter_name, '<* !_Total>' AS instance_name, 'Avg. microsec/Write Comp BASE' AS base_counter_name UNION ALL 263 | SELECT 'HTTP Storage' AS object_name, 'Avg. microsec/Write Comp BASE' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 264 | SELECT 'HTTP Storage' AS object_name, 'HTTP Storage IO failed/sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 265 | SELECT 'HTTP Storage' AS object_name, 'HTTP Storage IO retry/sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 266 | SELECT 'HTTP Storage' AS object_name, 'Outstanding HTTP Storage IO' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 267 | SELECT 'HTTP Storage' AS object_name, 'Read Bytes/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 268 | SELECT 'HTTP Storage' AS object_name, 'Reads/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 269 | SELECT 'HTTP Storage' AS object_name, 'Total Bytes/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 270 | SELECT 'HTTP Storage' AS object_name, 'Transfers/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 271 | SELECT 'HTTP Storage' AS object_name, 'Write Bytes/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name UNION ALL 272 | SELECT 'HTTP Storage' AS object_name, 'Writes/Sec' AS counter_name, '<* !_Total>' AS instance_name, NULL AS base_counter_name 273 | ; 274 | IF NOT EXISTS ( 275 |               SELECT 1 276 |               FROM sys.tables AS t 277 |               WHERE t.name = 'perf_counter_log' 278 |                     AND 279 |                     SCHEMA_NAME(t.schema_id) = 'dbo' 280 |               ) 281 | BEGIN 282 |     CREATE TABLE dbo.perf_counter_log 283 |     ( 284 |     iteration_number int NOT NULL, 285 |     collection_time datetimeoffset NOT NULL CONSTRAINT df_perf_counter_log_collection_time DEFAULT (SYSDATETIMEOFFSET()), 286 |     object_name nvarchar(128) NOT NULL, 287 |     counter_name nvarchar(128) NOT NULL, 288 |     instance_name nvarchar(128) NOT NULL, 289 |     counter_value float NOT NULL, 290 |     CONSTRAINT pk_perf_counter_log PRIMARY KEY (collection_time, object_name, counter_name, instance_name) 291 |     ); 292 | END; 293 | WHILE @IterationNumber <= @MaxIterationCount 294 | BEGIN 295 |     PRINT CAST(SYSDATETIMEOFFSET() AS nvarchar(40)) + ': Starting iteration ' + CAST(@IterationNumber AS varchar(11)); 296 |     -- Get the first snapshot of cumulative counters 297 |     INSERT INTO @FirstSnapshotCounter (object_name, counter_name, instance_name, cntr_value, base_cntr_value) 298 |     SELECT pc.object_name, pc.counter_name, pc.instance_name, pc.cntr_value, bc.cntr_value AS base_cntr_value 299 |     FROM sys.dm_os_performance_counters AS pc 300 |     INNER JOIN @SourceCounter AS sc 301 |     ON UPPER(RTRIM(pc.object_name)) LIKE '%' + UPPER(sc.object_name) 302 |        AND 303 |        UPPER(RTRIM(pc.counter_name)) = UPPER(sc.counter_name) 304 |        AND 305 |        ( 306 |        UPPER(RTRIM(pc.instance_name)) = UPPER(sc.instance_name) 307 |        OR 308 |        (sc.instance_name = '' AND TRY_CONVERT(uniqueidentifier, pc.instance_name) IS NOT NULL) 309 |        OR 310 |        (sc.instance_name = '<* !_Total>' AND pc.instance_name <> '_Total') 311 |        ) 312 |     OUTER APPLY ( 313 |                 SELECT pc2.cntr_value 314 |                 FROM sys.dm_os_performance_counters AS pc2 315 |                 WHERE pc2.cntr_type = 1073939712 316 |                       AND 317 |                       pc2.object_name = pc.object_name 318 |                       AND 319 |                       pc2.instance_name = pc.instance_name 320 |                       AND 321 |                       UPPER(RTRIM(pc2.counter_name)) = UPPER(sc.base_counter_name) 322 |                 ) AS bc 323 |     WHERE pc.cntr_type IN (272696576,1073874176) 324 |           OR 325 |           sc.object_name = 'Batch Resp Statistics' 326 |     OPTION (RECOMPILE) 327 |     ; 328 |     -- Wait for specified interval 329 |     SELECT @Delay = CONVERT(char(8), DATEADD(second, @SnapshotIntervalSeconds, 0), 114); 330 |     WAITFOR DELAY @Delay; 331 |     -- Get the second snapshot and record it in the log, 332 |     -- using point-in-time counters as is, 333 |     -- and calculating the values for other counter types 334 |     -- based on the first snapshot and current base counter values. 335 |     INSERT INTO dbo.perf_counter_log 336 |     ( 337 |     iteration_number, 338 |     object_name, 339 |     counter_name, 340 |     instance_name, 341 |     counter_value 342 |     ) 343 |     SELECT @IterationNumber AS iteration_number, 344 |            pc.object_name, 345 |            pc.counter_name, 346 |            ISNULL(pc.instance_name, '') AS instance_name, 347 |            ROUND( 348 |                 CASE WHEN sc.object_name = 'Batch Resp Statistics' THEN CAST((pc.cntr_value - fsc.cntr_value) AS float) -- Delta absolute 349 |                      WHEN pc.cntr_type = 65792 THEN pc.cntr_value -- Point-in-time 350 |                      WHEN pc.cntr_type = 272696576 THEN (pc.cntr_value - fsc.cntr_value) / CAST(@SnapshotIntervalSeconds AS float) -- Delta rate 351 |                      WHEN pc.cntr_type = 537003264 THEN CAST(100 AS float) * pc.cntr_value / NULLIF(bc.cntr_value, 0) -- Ratio 352 |                      WHEN pc.cntr_type = 1073874176 THEN ISNULL((pc.cntr_value - fsc.cntr_value) / NULLIF(bc.cntr_value - fsc.base_cntr_value, 0) / CAST(@SnapshotIntervalSeconds AS float), 0) -- Delta ratio 353 |                 END, 3) 354 |                 AS cntr_value 355 |     FROM sys.dm_os_performance_counters AS pc 356 |     INNER JOIN @SourceCounter AS sc 357 |     ON UPPER(RTRIM(pc.object_name)) LIKE '%' + UPPER(sc.object_name) 358 |        AND 359 |        UPPER(RTRIM(pc.counter_name)) = UPPER(sc.counter_name) 360 |        AND 361 |        ( 362 |        UPPER(RTRIM(pc.instance_name)) = UPPER(sc.instance_name) 363 |        OR 364 |        (sc.instance_name = '' AND TRY_CONVERT(uniqueidentifier, pc.instance_name) IS NOT NULL) 365 |        OR 366 |        (sc.instance_name = '<* !_Total>' AND pc.instance_name <> '_Total') 367 |        ) 368 |     OUTER APPLY ( 369 |                 SELECT TOP (1) fsc.cntr_value, 370 |                                fsc.base_cntr_value 371 |                 FROM @FirstSnapshotCounter AS fsc 372 |                 WHERE fsc.object_name = pc.object_name 373 |                       AND 374 |                       fsc.counter_name = pc.counter_name 375 |                       AND 376 |                       fsc.instance_name = pc.instance_name 377 |                 ) AS fsc 378 |     OUTER APPLY ( 379 |                 SELECT TOP (1) pc2.cntr_value 380 |                 FROM sys.dm_os_performance_counters AS pc2 381 |                 WHERE pc2.cntr_type = 1073939712 382 |                       AND 383 |                       pc2.object_name = pc.object_name 384 |                       AND 385 |                       pc2.instance_name = pc.instance_name 386 |                       AND 387 |                       UPPER(RTRIM(pc2.counter_name)) = UPPER(sc.base_counter_name) 388 |                 ) AS bc 389 |     WHERE -- Exclude base counters 390 |           pc.cntr_type IN (65792,272696576,537003264,1073874176) 391 |     OPTION (RECOMPILE) 392 |     ; 393 |     -- Reset for next iteration 394 |     DELETE 395 |     FROM @FirstSnapshotCounter; 396 |     SELECT @IterationNumber += 1; 397 | END; 398 | -------------------------------------------------------------------------------- /resource_stats/mi_server_resource_stats.sql: -------------------------------------------------------------------------------- 1 | /* 2 | On Azure SQL Database Managed Instance, the sys.server_resource_stats view is populated 3 | via a monitoring pipeline that has typical data latency in a single minutes range. Therefore, 4 | data in this view often appears delayed. 5 | 6 | As a workaround, the dbo.server_resource_stats view defined below can be used to obtain resource 7 | stats in real time as they are emitted by the instance using the managed_instance_resource_stats 8 | extended event. 9 | 10 | The script creates an event session that starts automatically on instance startup and collects 11 | the managed_instance_resource_stats event in a memory ring buffer. Each event is represented by an 12 | XML node in the ring buffer data. The view shreds and parses XML to provide a relational rowset view 13 | of the ring buffer, and then unions this set with the existing sys.server_resource_stats view to 14 | provide both current and historical resource stats. 15 | */ 16 | 17 | USE master; 18 | 19 | IF NOT EXISTS ( 20 | SELECT 1 21 | FROM sys.dm_xe_sessions 22 | WHERE name = 'current_resource_stats' 23 | ) 24 | BEGIN 25 | -- Create an extended events session capturing resource stats events in a ring buffer 26 | CREATE EVENT SESSION current_resource_stats ON SERVER 27 | ADD EVENT sqlazure_min.managed_instance_resource_stats 28 | ADD TARGET package0.ring_buffer(SET max_events_limit=50) -- 50 events cover the last 125 minutes. Can be increased in case of very high data latency in sys.server_resource_stats. 29 | WITH (EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=10 SECONDS,STARTUP_STATE=ON); 30 | 31 | ALTER EVENT SESSION current_resource_stats ON SERVER STATE = START; 32 | END; 33 | GO 34 | 35 | CREATE OR ALTER VIEW dbo.server_resource_stats 36 | AS 37 | 38 | WITH 39 | RingBuffer AS 40 | ( 41 | SELECT CAST(xst.target_data AS xml) AS TargetData 42 | FROM sys.dm_xe_session_targets AS xst 43 | INNER JOIN sys.dm_xe_sessions AS xs 44 | ON xst.event_session_address = xs.address 45 | WHERE xs.name = N'current_resource_stats' 46 | ), 47 | EventNode AS 48 | ( 49 | SELECT CAST(NodeData.query('.') AS xml) AS EventInfo 50 | FROM RingBuffer AS rb 51 | CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData) 52 | ) 53 | SELECT EventInfo.value('(//event/data[@name="start_time"]/value)[1]','datetime') AS start_time, 54 | EventInfo.value('(//event/data[@name="end_time"]/value)[1]','datetime') AS end_time, 55 | N'SQL managed instance' AS resource_type, 56 | EventInfo.value('(//event/data[@name="server_name"]/value)[1]','nvarchar(256)') AS resource_name, 57 | EventInfo.value('(//event/data[@name="sku"]/value)[1]','nvarchar(256)') AS sku, 58 | EventInfo.value('(//event/data[@name="hardware_generation"]/value)[1]','nvarchar(256)') AS hardware_generation, 59 | EventInfo.value('(//event/data[@name="virtual_core_count"]/value)[1]','int') AS virtual_core_count, 60 | EventInfo.value('(//event/data[@name="avg_cpu_percent"]/value)[1]','decimal(5,2)') AS avg_cpu_percent, 61 | EventInfo.value('(//event/data[@name="reserved_storage_mb"]/value)[1]','bigint') AS reserved_storage_mb, 62 | EventInfo.value('(//event/data[@name="storage_space_used_mb"]/value)[1]','decimal(18,2)') AS storage_space_used_mb, 63 | EventInfo.value('(//event/data[@name="io_requests"]/value)[1]','bigint') AS io_requests, 64 | EventInfo.value('(//event/data[@name="io_bytes_read"]/value)[1]','bigint') AS io_bytes_read, 65 | EventInfo.value('(//event/data[@name="io_bytes_written"]/value)[1]','bigint') AS io_bytes_written 66 | FROM EventNode 67 | UNION 68 | SELECT start_time, 69 | end_time, 70 | resource_type, 71 | resource_name, 72 | sku, 73 | hardware_generation, 74 | virtual_core_count, 75 | avg_cpu_percent, 76 | reserved_storage_mb, 77 | storage_space_used_mb, 78 | io_requests, 79 | io_bytes_read, 80 | io_bytes_written 81 | FROM master.sys.server_resource_stats; 82 | GO 83 | 84 | SELECT * 85 | FROM dbo.server_resource_stats 86 | ORDER BY start_time DESC; 87 | -------------------------------------------------------------------------------- /resource_stats/real_time_resource_stats.sql: -------------------------------------------------------------------------------- 1 | WITH instance_resource_stats_agg /* resource usage snapshot aggregated across all resource pools */ 2 | AS 3 | ( 4 | SELECT snapshot_time, 5 | duration_ms, 6 | instance_vcores, 7 | SUM(delta_cpu_usage_ms) AS delta_cpu_usage_ms, 8 | SUM(delta_log_bytes_used) AS delta_log_bytes_used, 9 | SUM(delta_read_io_completed) AS delta_read_io_completed, 10 | SUM(delta_write_io_completed) AS delta_write_io_completed, 11 | SUM(delta_read_bytes) AS delta_read_bytes, 12 | SUM(delta_write_bytes) AS delta_write_bytes, 13 | SUM(active_worker_count) AS active_worker_count, 14 | SUM(active_session_count) AS active_session_count, 15 | SUM(IIF(name = 'SloHkPool', used_memory_kb, 0)) AS xtp_used_memory_kb, 16 | SUM(IIF(name = 'SloHkPool', max_memory_kb, 0)) AS xtp_max_memory_kb 17 | FROM sys.dm_resource_governor_resource_pools_history_ex 18 | GROUP BY snapshot_time, 19 | /* assumption: duration_ms and instance_vcores is constant for every snapshot */ 20 | duration_ms, 21 | instance_vcores 22 | ) 23 | SELECT rs.snapshot_time, 24 | /* cap all metrics at 100% */ 25 | LEAST(CAST(rs.delta_cpu_usage_ms * 1. / rs.duration_ms / rs.instance_vcores * 100 AS decimal(5, 2)), 100) AS avg_instance_cpu_percent, 26 | LEAST(CAST(rs.delta_log_bytes_used * 1. / rs.duration_ms * 1000 / irg.instance_max_log_rate * 100 as decimal(5, 2)), 100) AS avg_instance_log_write_percent, 27 | LEAST(CAST(rs.active_worker_count * 1. / irg.instance_max_worker_threads * 100 AS decimal(5,2)), 100) AS instance_worker_percent, 28 | LEAST(CAST(rs.active_session_count * 1. / 30000 * 100 AS decimal(5,2)), 100) AS instance_session_percent, 29 | LEAST(CAST(rs.xtp_used_memory_kb * 1. / rs.xtp_max_memory_kb * 100 AS decimal(5,2)), 100) AS xtp_memory_percent, 30 | /* Instance data IO cap is not defined on MI GP, thus we cannot calculate an unambiguous percentage. Return absolute IOPS/throughput values for reads and writes instead. */ 31 | CAST(delta_read_io_completed * 1. / (rs.duration_ms / 1000.) AS decimal(12,2)) AS avg_read_iops, 32 | CAST(delta_write_io_completed * 1. / (rs.duration_ms / 1000.) AS decimal(12,2)) AS avg_write_iops, 33 | CAST(delta_read_bytes / 1024. / 1024 / (rs.duration_ms / 1000.) AS decimal(14,4)) AS avg_read_throughput_mbps, 34 | CAST(delta_write_bytes / 1024. / 1024 / (rs.duration_ms / 1000.) AS decimal(14,4)) AS avg_write_throughput_mbps 35 | FROM instance_resource_stats_agg AS rs 36 | CROSS JOIN sys.dm_instance_resource_governance AS irg 37 | ORDER BY snapshot_time DESC; 38 | -------------------------------------------------------------------------------- /sp_readmierrorlog/sp_readmierrorlog.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Description: 3 | dbo.sp_readmierrorlog is a stored procedure that returns the contents of SQL Server and SQL Agent error logs on an MI instance. 4 | The procedure filters out debug-level messages logged for service operation and troubleshooting purposes, 5 | in order to make the error log more readable and actionable for MI users. 6 | The procedure can be customized to add/remove specific filter strings. 7 | 8 | Unfiltered error log remains available using the sys.sp_readerrorlog stored procedure. 9 | 10 | Usage examples: 11 | 12 | -- Current filtered MI error log 13 | EXEC dbo.sp_readmierrorlog; 14 | 15 | -- Filtered MI error log before last rollover 16 | EXEC dbo.sp_readmierrorlog 1; 17 | 18 | -- Current filtered MI error log with messages containing string "Error: 18056" 19 | EXEC dbo.sp_readmierrorlog 0, 1, 'Error: 18056'; 20 | 21 | -- Current filtered MI error log with messages containing strings "Error: 18056" and "state: 1" 22 | EXEC dbo.sp_readmierrorlog 0, 1, 'Error: 18056', 'state: 1'; 23 | 24 | -- Current filtered MI SQL Agent log 25 | EXEC dbo.sp_readmierrorlog 0, 2; 26 | */ 27 | 28 | CREATE OR ALTER PROCEDURE dbo.sp_readmierrorlog 29 | @p1 int = 0, 30 | @p2 int = NULL, 31 | @p3 nvarchar(4000) = NULL, 32 | @p4 nvarchar(4000) = NULL 33 | AS 34 | 35 | SET NOCOUNT ON; 36 | 37 | DECLARE @ErrorLog TABLE ( 38 | LogID int NOT NULL IDENTITY(1,1), 39 | LogDate datetime NOT NULL, 40 | ProcessInfo nvarchar(50) NOT NULL, 41 | LogText nvarchar(4000) NOT NULL, 42 | PRIMARY KEY (LogDate, LogID) 43 | ); 44 | DECLARE @LogFilter TABLE ( 45 | FilterText nvarchar(100) NOT NULL PRIMARY KEY, 46 | FilterType tinyint NOT NULL -- 1 - starts with; 2 - contains; 3 - starts with "Backup(" 47 | ); 48 | 49 | IF (NOT IS_SRVROLEMEMBER(N'securityadmin') = 1) AND (NOT HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW SERVER STATE') = 1) 50 | BEGIN 51 | RAISERROR(27219,-1,-1); 52 | RETURN (1); 53 | END; 54 | 55 | -- Populate filter table 56 | INSERT INTO @LogFilter 57 | ( 58 | FilterText, 59 | FilterType 60 | ) 61 | VALUES 62 | ('`[AzureKeyVaultClientHelper::CheckDbAkvWrapUnwrap`]: Skipped',1), 63 | (' `[RotateDatabaseKeys`]',1), 64 | (' PVS',2), 65 | ('`[ERROR`] Log file %.xel cannot be deleted. Last error code from CreateFile is 32',2), 66 | (') log capture is rescheduled',2), 67 | ('`[CFabricCommonUtils::',1), 68 | ('`[CFabricGenericSubscriber::',1), 69 | ('`[CFabricReplicaManager::',1), 70 | ('`[CFabricReplicaPublisher::',1), 71 | ('`[CFabricReplicatorProxy::',1), 72 | ('`[CheckDbAkvAccess`]',1), 73 | ('`[CreateExternalDevOpsLogins`]',1), 74 | ('`[CurrentSecretName`]',1), 75 | ('`[DbMgrPartnerCommitPolicy::',1), 76 | ('`[DbrSubscriber`]',1), 77 | ('`[DevOpsSnapshotTelemetryTask`]',1), 78 | ('`[DISK_SPACE_TO_RESERVE_PROPERTY`]:',1), 79 | ('`[DropDevOpsLogins`]',1), 80 | ('`[EnableBPEOnAzure`]',1), 81 | ('`[FabricDbrSubscriber::',1), 82 | ('`[GenericSubscriber`]',1), 83 | ('`[GetEncryptionProtectorTypeInternal`]',1), 84 | ('`[GetInstanceSloGuid`]',1), 85 | ('`[GetInterfaceEndpointsConfigurationInternal`]',1), 86 | ('`[GetTdeAkvUrisInternal`]',1), 87 | ('`[HADR Endpoint Sync`] ',1), 88 | ('`[HADR Fabric`]',1), 89 | ('`[HADR TRANSPORT`]',1), 90 | ('`[INFO`] `[CKPT`] ',1), 91 | ('`[INFO`] ckptCloseThreadFn():',1), 92 | ('`[INFO`] createBackupContextV2()',1), 93 | ('`[INFO`] Created Extended Events session',1), 94 | ('`[INFO`] Database ID:',1), 95 | ('`[INFO`] getMaxUnrecoverableCheckpointId():',1), 96 | ('`[INFO`] Hk',1), 97 | ('`[INFO`] HostCommonStorage',1), 98 | ('`[INFO`] ProcessElementsInBackupContext().',1), 99 | ('`[INFO`] RootFileDeserialize():',1), 100 | ('`[INFO`] SqlHkHostLog::',1), 101 | ('`[INFO`] trimSystemTablesByLsn():',1), 102 | ('`[LAGController`]',1), 103 | ('`[LAGConfig`]',1), 104 | ('`[LAGPartnerConfiguration`]',1), 105 | ('`[LoginSnapshotTelemetry`] ',1), 106 | ('`[LogPool::',1), 107 | ('`[ProcessExternalDevOpsLogins`]',1), 108 | ('`[ReadExternalDevopsLoginsFabricProperty`]',1), 109 | ('`[ReplicaController',1), 110 | ('`[SetupAkvPrincipalCert`]',1), 111 | ('`[SetupInterfaceEndpointsConfiguration`]',1), 112 | ('`[SetupTdeAkvUri`]',1), 113 | ('`[SetupSslServerCertificate`]',1), 114 | ('`[SetupTenantCertificates`]',1), 115 | ('`[SloManager::AdjustCpuSettingForResource',1), 116 | ('`[SloParams::ParseSloParams`]',1), 117 | ('`[SQLInstancePartner`]',1), 118 | ('`[TransportSubscriber`]',1), 119 | ('`[XDB_DATABASE_SETTINGS_PROPERTY',1), 120 | ('`[VersionCleaner`]`[DbId:',1), 121 | ('`[WARNING`] === At least % extensions for file {',2), 122 | ('`] local replica received build replica response from `[',2), 123 | ('`] log capture becomes idle',2), 124 | ('A connection for availability group',1), 125 | ('accepting vlf header',1), 126 | ('AppInstanceId `[%`]. LeaseOrderId',2), 127 | ('BACKUP DATABASE WITH DIFFERENTIAL successfully processed',1), 128 | ('Backup(',3), 129 | ('Backup(managed_model):',1), 130 | ('Backup(msdb):',1), 131 | ('Backup(replicatedmaster):',1), 132 | ('Cannot open database ''model_msdb'' version',1), 133 | ('CFabricReplicaController',2), 134 | ('CHadrSession',1), 135 | ('CImageHelper::Init () Version-specific dbghelp.dll is not used',1), 136 | ('Cleaning up conversations for `[',1), 137 | ('cloud Partition',1), 138 | ('CloudTelemetryBase',1), 139 | ('Copying dbt_inactiveDurationMin',1), 140 | ('Database differential changes were backed up.',1), 141 | ('DbMgrPartnerCommitPolicy',1), 142 | ('DBR Subscriber',1), 143 | ('Deflation Settings',2), 144 | ('DeflationSettings',2), 145 | ('DWLSSettings',1), 146 | ('Dynamic Configuration:',1), 147 | ('Error: 946, Severity: 14, State: 1.',1), 148 | ('FabricDBTableInfo',1), 149 | ('Failed to retrieve Property',1), 150 | ('Filemark on device',1), 151 | ('FixupLogTail(progress) zeroing',1), 152 | ('Force log send mode',1), 153 | ('FSTR: File \\',1), 154 | ('HADR_FQDR_XRF:',1), 155 | ('HaDrDbMgr',2), 156 | ('HadrLogCapture::CaptureLogBlock',2), 157 | ('HadrRuntimeCallbacks::WaitForAgMasterReady ',1), 158 | ('Http code after sending the notification for action',1), 159 | ('is upgrading script ''Sql.UserDb.Sql''',2), 160 | ('IsInCreate',1), 161 | ('Layered AG Role',1), 162 | ('Log was backed up. Database:',1), 163 | ('Log writer started sending: DbId `[',1), 164 | ('LOG_SEND_TRANSITION: DbId',1), 165 | ('LogPool::',1), 166 | ('PerformConfigureDatabaseInternal',1), 167 | ('Persistent store table',2), 168 | ('Phase end: ',1), 169 | ('Phase start: ',1), 170 | ('PrimaryReplicaInfoMsg',1), 171 | ('Processing BuildReplicaCatchup source operation on replica `[',1), 172 | ('Processing pending list',1), 173 | ('Processing PrimaryConfigUpdated Event',1), 174 | ('ProcessPrimaryReplicaInfoMsg',1), 175 | ('Querying Property Manager for Property',1), 176 | ('RefreshFabricPropertyServiceObjective',1), 177 | ('ResyncWithPrimary',1), 178 | ('Retrieved Property',1), 179 | ('Sending the notification action',1), 180 | ('SetDbFields',1), 181 | ('Skip Initialization for XE session',1), 182 | ('Skipped running db sample script',1), 183 | ('SloInfo',1), 184 | ('SloManager::',1), 185 | ('SloPropertyBagRestrictionsOverride property not found for database ',1), 186 | ('SloRgPropertyBag',1), 187 | ('snapshot isolation setting ON for logical master.',2), 188 | ('State information for database ''',1), 189 | ('The recovery LSN (',1), 190 | ('UpdateHadronTruncationLsn(',1), 191 | ('Volume file entity not null',1), 192 | ('Warning: The join order has been enforced because a local join hint is used.',1), 193 | ('XactRM::PrepareLocalXact',2), 194 | ('XE_FS_IGNORE_XE_FILE_TARGET:',1), 195 | ('Zeroing ',1) 196 | ; 197 | 198 | -- Get unfiltered log 199 | IF @p2 IS NULL 200 | BEGIN 201 | INSERT INTO @ErrorLog (LogDate, ProcessInfo, LogText) 202 | EXEC sys.xp_readerrorlog @p1; 203 | END 204 | ELSE 205 | BEGIN 206 | INSERT INTO @ErrorLog (LogDate, ProcessInfo, LogText) 207 | EXEC sys.xp_readerrorlog @p1,@p2,@p3,@p4; 208 | END; 209 | 210 | -- Return filtered log 211 | SELECT el.LogDate, 212 | el.ProcessInfo, 213 | el.LogText 214 | FROM @ErrorLog AS el 215 | WHERE NOT EXISTS ( 216 | SELECT 1 217 | FROM @LogFilter AS lf 218 | WHERE ( 219 | lf.FilterType = 1 220 | AND 221 | el.LogText LIKE lf.FilterText + N'%' ESCAPE '`' 222 | ) 223 | OR 224 | ( 225 | lf.FilterType = 2 226 | AND 227 | el.LogText LIKE N'%' + lf.FilterText + N'%' ESCAPE '`' 228 | ) 229 | OR 230 | ( 231 | lf.FilterType = 3 232 | AND 233 | el.LogText LIKE lf.FilterText + N'%' 234 | AND 235 | TRY_CONVERT(uniqueidentifier, SUBSTRING(el.LogText, 8, 36)) IS NOT NULL 236 | ) 237 | ) 238 | ORDER BY el.LogDate, 239 | el.LogID 240 | OPTION (RECOMPILE, MAXDOP 1); 241 | --------------------------------------------------------------------------------