diff --git a/Install-All/DarlingData.sql b/Install-All/DarlingData.sql index 2a90576..ef14d06 100644 --- a/Install-All/DarlingData.sql +++ b/Install-All/DarlingData.sql @@ -1,4 +1,4 @@ --- Compile Date: 06/14/2024 19:29:20 UTC +-- Compile Date: 06/28/2024 19:44:07 UTC SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; @@ -66,8 +66,8 @@ BEGIN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT - @version = '1.5', - @version_date = '20240401'; + @version = '1.7', + @version_date = '20240701'; IF @help = 1 BEGIN @@ -398,20 +398,27 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. FROM sys.dm_os_wait_stats AS dows WHERE dows.wait_type IN ( - N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', N'CHKPT', - N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', - N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', N'FSAGENT', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', N'HADR_CLUSAPI_CALL', - N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE', - N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', N'MEMORY_ALLOCATION_EXT', N'ONDEMAND_TASK_QUEUE', N'PARALLEL_REDO_DRAIN_WORKER', - N'PARALLEL_REDO_LOG_CACHE', N'PARALLEL_REDO_TRAN_LIST', N'PARALLEL_REDO_WORKER_SYNC', N'PARALLEL_REDO_WORKER_WAIT_WORK', N'PREEMPTIVE_OS_FLUSHFILEBUFFERS', + N'ASYNC_NETWORK_IO', N'AZURE_IMDS_VERSIONS', N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', + N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', + N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', + N'DBMIRROR_DBM_EVENT', N'DBMIRROR_DBM_MUTEX', N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_SEND', + N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', + N'FSAGENT', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', N'HADR_CLUSAPI_CALL', + N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', + N'HADR_WORK_QUEUE', N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', + N'MEMORY_ALLOCATION_EXT', N'ONDEMAND_TASK_QUEUE', N'PARALLEL_REDO_DRAIN_WORKER', N'PARALLEL_REDO_LOG_CACHE', + N'PARALLEL_REDO_TRAN_LIST', N'PARALLEL_REDO_WORKER_SYNC', N'PARALLEL_REDO_WORKER_WAIT_WORK', N'PREEMPTIVE_OS_FLUSHFILEBUFFERS', N'PREEMPTIVE_XE_GETTARGETSTATE', N'PVS_PREALLOCATE', N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'PWAIT_DIRECTLOGCONSUMER_GETNEXT', - N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE', N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', - N'QDS_SHUTDOWN_QUEUE', N'REDO_THREAD_PENDING_WORK', N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK', N'SLEEP_DBSTARTUP', - N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY', N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', N'SLEEP_TEMPDBSTARTUP', - N'SNI_HTTP_ACCEPT', N'SOS_WORK_DISPATCHER', N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', - N'SQLTRACE_WAIT_ENTRIES', N'UCS_SESSION_REGISTRATION', N'VDI_CLIENT_OTHER', N'WAIT_FOR_RESULTS', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', N'WAIT_XTP_RECOVERY', - N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN', N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT', - N'AZURE_IMDS_VERSIONS', N'XE_FILE_TARGET_TVF', N'XE_LIVE_TARGET_TVF', N'DBMIRROR_DBM_MUTEX', N'DBMIRROR_SEND', N'ASYNC_NETWORK_IO' + N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', N'QDS_ASYNC_QUEUE', N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', + N'QDS_SHUTDOWN_QUEUE', N'REDO_THREAD_PENDING_WORK', N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE', + N'SERVER_IDLE_CHECK', N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', + N'SLEEP_MASTERMDREADY', N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', + N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT', N'SOS_WORK_DISPATCHER', N'SP_SERVER_DIAGNOSTICS_SLEEP', + N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'SQLTRACE_WAIT_ENTRIES', N'UCS_SESSION_REGISTRATION', + N'VDI_CLIENT_OTHER', N'WAIT_FOR_RESULTS', N'WAIT_XTP_CKPT_CLOSE', N'WAIT_XTP_HOST_WAIT', + N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_RECOVERY', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', + N'XE_DISPATCHER_JOIN', N'XE_DISPATCHER_WAIT', N'XE_FILE_TARGET_TVF', N'XE_LIVE_TARGET_TVF', + N'XE_TIMER_EVENT' ) OPTION(RECOMPILE); END; /*End waits ignore*/ @@ -2960,8 +2967,8 @@ SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT - @version = '5.5', - @version_date = '20240401'; + @version = '5.7', + @version_date = '20240701'; IF @help = 1 BEGIN @@ -7687,8 +7694,8 @@ SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT - @version = '3.5', - @version_date = '20240401'; + @version = '3.7', + @version_date = '20240701'; IF @help = 1 BEGIN @@ -8750,7 +8757,11 @@ BEGIN deqs.max_reserved_threads, deqs.min_used_threads, deqs.max_used_threads, - deqs.total_rows + deqs.total_rows, + max_worker_time_ms = + deqs.max_worker_time / 1000., + max_elapsed_time_ms = + deqs.max_elapsed_time / 1000. INTO #dm_exec_query_stats_sh FROM sys.dm_exec_query_stats AS deqs WHERE EXISTS @@ -8787,8 +8798,10 @@ BEGIN ap.executions_per_second, ap.total_worker_time_ms, ap.avg_worker_time_ms, + ap.max_worker_time_ms, ap.total_elapsed_time_ms, ap.avg_elapsed_time_ms, + ap.max_elapsed_time_ms, ap.total_logical_reads_mb, ap.total_physical_reads_mb, ap.total_logical_writes_mb, @@ -8830,7 +8843,9 @@ BEGIN c.min_used_threads, c.max_used_threads, c.total_rows, - c.query_plan + c.query_plan, + c.max_worker_time_ms, + c.max_elapsed_time_ms FROM #available_plans_sh AS ap OUTER APPLY ( @@ -9564,7 +9579,11 @@ SELECT deqs.max_reserved_threads, deqs.min_used_threads, deqs.max_used_threads, - deqs.total_rows + deqs.total_rows, + max_worker_time_ms = + deqs.max_worker_time / 1000., + max_elapsed_time_ms = + deqs.max_elapsed_time / 1000. INTO #dm_exec_query_stats FROM sys.dm_exec_query_stats AS deqs WHERE EXISTS @@ -9602,8 +9621,10 @@ SELECT ap.executions_per_second, ap.total_worker_time_ms, ap.avg_worker_time_ms, + ap.max_worker_time_ms, ap.total_elapsed_time_ms, ap.avg_elapsed_time_ms, + ap.max_elapsed_time_ms, ap.total_logical_reads_mb, ap.total_physical_reads_mb, ap.total_logical_writes_mb, @@ -9646,7 +9667,9 @@ FROM c.min_used_threads, c.max_used_threads, c.total_rows, - c.query_plan + c.query_plan, + c.max_worker_time_ms, + c.max_elapsed_time_ms FROM #available_plans AS ap OUTER APPLY ( @@ -10510,20 +10533,20 @@ SET STATISTICS TIME, IO OFF; GO /* -██╗ ██████╗ ██████╗ -██║ ██╔═══██╗██╔════╝ -██║ ██║ ██║██║ ███╗ -██║ ██║ ██║██║ ██║ -███████╗╚██████╔╝╚██████╔╝ -╚══════╝ ╚═════╝ ╚═════╝ - +██╗ ██████╗ ██████╗ +██║ ██╔═══██╗██╔════╝ +██║ ██║ ██║██║ ███╗ +██║ ██║ ██║██║ ██║ +███████╗╚██████╔╝╚██████╔╝ +╚══════╝ ╚═════╝ ╚═════╝ + ██╗ ██╗██╗ ██╗███╗ ██╗████████╗███████╗██████╗ ██║ ██║██║ ██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗ ███████║██║ ██║██╔██╗ ██║ ██║ █████╗ ██████╔╝ ██╔══██║██║ ██║██║╚██╗██║ ██║ ██╔══╝ ██╔══██╗ ██║ ██║╚██████╔╝██║ ╚████║ ██║ ███████╗██║ ██║ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ - + Copyright 2024 Darling Data, LLC https://www.erikdarling.com/ @@ -10542,10 +10565,10 @@ EXEC sp_LogHunter; */ -IF OBJECT_ID('dbo.sp_LogHunter') IS NULL - BEGIN - EXEC ('CREATE PROCEDURE dbo.sp_LogHunter AS RETURN 138;'); - END; +IF OBJECT_ID('dbo.sp_LogHunter') IS NULL + BEGIN + EXEC ('CREATE PROCEDURE dbo.sp_LogHunter AS RETURN 138;'); + END; GO ALTER PROCEDURE @@ -10565,15 +10588,15 @@ ALTER PROCEDURE ) WITH RECOMPILE AS -SET STATISTICS XML OFF; +SET STATISTICS XML OFF; SET NOCOUNT ON; -SET XACT_ABORT ON; +SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; BEGIN SELECT - @version = '1.5', - @version_date = '20240401'; + @version = '1.7', + @version_date = '20240701'; IF @help = 1 BEGIN @@ -10583,7 +10606,7 @@ BEGIN SELECT 'you can use me to look through your error logs for bad stuff' UNION ALL SELECT 'all scripts and documentation are available here: https://github.com/erikdarlingdata/DarlingData/tree/main/sp_LogHunter' UNION ALL SELECT 'from your loving sql server consultant, erik darling: https://erikdarling.com'; - + SELECT parameter_name = ap.name, @@ -10638,38 +10661,38 @@ BEGIN AND ap.user_type_id = t.user_type_id WHERE o.name = N'sp_LogHunter' OPTION(RECOMPILE); - + SELECT mit_license_yo = 'i am MIT licensed, so like, do whatever' - + UNION ALL - + SELECT mit_license_yo = 'see printed messages for full license'; - + RAISERROR(' MIT License - + Copyright 2024 Darling Data, LLC - + https://www.erikdarling.com/ - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ', 0, 1) WITH NOWAIT; - + RETURN; END; - + /*Check if we have sa permissisions*/ IF ( @@ -10715,7 +10738,7 @@ BEGIN RAISERROR(N'%i is not not a valid language_id in sys.messages.', 11, 1, @language_id) WITH NOWAIT; RETURN; END; - + /*Fix days back a little bit*/ IF @days_back = 0 BEGIN @@ -10728,7 +10751,7 @@ BEGIN SELECT @days_back *= -1; END; - + IF @start_date IS NOT NULL AND @end_date IS NOT NULL AND @days_back IS NOT NULL @@ -10777,7 +10800,7 @@ BEGIN @t_searches int = 0 /*total number of searches to run*/, @l_count int = 1 /*loop count*/, @stopper bit = 0 /*stop loop execution safety*/; - + /*temp tables for holding temporary things*/ CREATE TABLE #error_log @@ -10786,7 +10809,7 @@ BEGIN process_info nvarchar(100), text nvarchar(4000) ); - + CREATE TABLE #enum ( @@ -10857,7 +10880,7 @@ BEGIN AND e.archive > 0 OPTION(RECOMPILE); END; - + /*filter out log files we won't use, if @start_date and @end_date are set*/ IF @start_date IS NOT NULL AND @end_date IS NOT NULL @@ -10966,7 +10989,7 @@ BEGIN N'"' + CONVERT(nvarchar(30), @end_date) + N'"' ) AS c WHERE @custom_message_only = 0 - OPTION(RECOMPILE); + OPTION(RECOMPILE); /*deal with a custom search string here*/ INSERT @@ -10999,7 +11022,7 @@ BEGIN BEGIN SELECT table_name = '#search', s.* FROM #search AS s; END; - + /*Set the min and max logs we're getting for the loop*/ SELECT @l_log = MIN(e.archive), @@ -11016,7 +11039,7 @@ BEGIN END; IF @debug = 1 BEGIN RAISERROR('Declaring cursor', 0, 1) WITH NOWAIT; END; - + /*start the loops*/ WHILE @l_log <= @h_log BEGIN @@ -11031,17 +11054,17 @@ BEGIN SELECT command FROM #search; - + IF @debug = 1 BEGIN RAISERROR('Opening cursor', 0, 1) WITH NOWAIT; END; - + OPEN c; - + FETCH FIRST FROM c INTO @c; IF @debug = 1 BEGIN RAISERROR('Entering WHILE loop', 0, 1) WITH NOWAIT; END; - WHILE @@FETCH_STATUS = 0 AND @stopper = 0 + WHILE @@FETCH_STATUS = 0 AND @stopper = 0 BEGIN IF @debug = 1 BEGIN RAISERROR('Entering cursor', 0, 1) WITH NOWAIT; END; /*Replace the canary value with the log number we're working in*/ @@ -11058,9 +11081,9 @@ BEGIN BEGIN RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; RAISERROR('search %i of %i', 0, 1, @l_count, @t_searches) WITH NOWAIT; - RAISERROR('@c: %s', 0, 1, @c) WITH NOWAIT; + RAISERROR('@c: %s', 0, 1, @c) WITH NOWAIT; END; - + IF @debug = 1 BEGIN RAISERROR('Inserting to error log', 0, 1) WITH NOWAIT; END; BEGIN BEGIN TRY @@ -11085,10 +11108,10 @@ BEGIN VALUES ( @c - ); + ); END CATCH; END; - + IF @debug = 1 BEGIN RAISERROR('Fetching next', 0, 1) WITH NOWAIT; END; /*Get the next search command*/ FETCH NEXT @@ -11100,7 +11123,7 @@ BEGIN @l_count += 1; END; - + IF @debug = 1 BEGIN RAISERROR('Getting next log', 0, 1) WITH NOWAIT; END; /*Increment the log numbers*/ SELECT @@ -11112,18 +11135,18 @@ BEGIN IF @debug = 1 BEGIN - RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; + RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; END; /*Stop the loop if this is NULL*/ IF @l_log IS NULL BEGIN - IF @debug = 1 BEGIN RAISERROR('Breaking', 0, 1) WITH NOWAIT; END; + IF @debug = 1 BEGIN RAISERROR('Breaking', 0, 1) WITH NOWAIT; END; SET @stopper = 1; BREAK; - END; + END; IF @debug = 1 BEGIN RAISERROR('Ended WHILE loop', 0, 1) WITH NOWAIT; END; - + /*Close out the cursor*/ CLOSE c; DEALLOCATE c; @@ -11179,7 +11202,7 @@ BEGIN 1/0 FROM #errors AS e ) - BEGIN + BEGIN SELECT table_name = '#errors', @@ -11264,8 +11287,8 @@ SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT - @version = '4.5', - @version_date = '20240401'; + @version = '4.7', + @version_date = '20240701'; IF @help = 1 @@ -11547,7 +11570,9 @@ OPTION(MAXDOP 1, RECOMPILE);', N':' END + N'%', - @memory_grant_cap xml + @memory_grant_cap xml, + @cache_xml xml, + @cache_sql nvarchar(MAX) = N''; DECLARE @waits table @@ -11877,7 +11902,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ( dows.wait_type = N'SLEEP_TASK' AND ISNULL(CONVERT(decimal(38, 2), dows.wait_time_ms / - NULLIF(1.* dows.waiting_tasks_count, 0.)), 0.) > 1000. + NULLIF(1.* dows.waiting_tasks_count, 0.)), 0.) >= + CASE WHEN @sample_seconds > 0 THEN 0. ELSE 1000. END ) ) AND @@ -11964,7 +11990,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ) FROM @waits AS w ORDER BY - w.sorting; + w.sorting + OPTION(MAXDOP 1, RECOMPILE); END; IF @@ -12024,7 +12051,8 @@ OPTION(MAXDOP 1, RECOMPILE);', AND w.sample_time < w2.sample_time AND (w2.waiting_tasks_count_n - w.waiting_tasks_count_n) > 0 ORDER BY - wait_time_seconds DESC; + wait_time_seconds DESC + OPTION(MAXDOP 1, RECOMPILE); END; END; /* @@ -12199,7 +12227,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ( vfs.num_of_reads > 0 OR vfs.num_of_writes > 0 - );' + ) + OPTION(MAXDOP 1, RECOMPILE);' ); IF @debug = 1 @@ -12322,7 +12351,8 @@ OPTION(MAXDOP 1, RECOMPILE);', FROM file_metrics AS fm ) ORDER BY - total_avg_stall_ms DESC; + total_avg_stall_ms DESC + OPTION(MAXDOP 1, RECOMPILE); END; IF @@ -12482,8 +12512,9 @@ OPTION(MAXDOP 1, RECOMPILE);', OR f.total_write_count > 0 ) ORDER BY - f.total_avg_stall DESC; - END + f.total_avg_stall DESC + OPTION(MAXDOP 1, RECOMPILE); + END; END; /*End file stats*/ /* @@ -12603,7 +12634,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ORDER BY p.object_name, p.counter_name, - p.cntr_value DESC; + p.cntr_value DESC + OPTION(MAXDOP 1, RECOMPILE); END; IF @@ -12657,7 +12689,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ORDER BY p.object_name, p.counter_name, - p.total_difference_i DESC; + p.total_difference_i DESC + OPTION(MAXDOP 1, RECOMPILE); END; END; /*End Perfmon*/ @@ -12986,14 +13019,16 @@ OPTION(MAXDOP 1, RECOMPILE);', SELECT @total_physical_memory_gb = CEILING(dosm.total_physical_memory_kb / 1024. / 1024.) - FROM sys.dm_os_sys_memory AS dosm; + FROM sys.dm_os_sys_memory AS dosm + OPTION(MAXDOP 1, RECOMPILE); END; IF @azure = 1 BEGIN SELECT @total_physical_memory_gb = SUM(osi.committed_target_kb / 1024. / 1024.) - FROM sys.dm_os_sys_info osi; + FROM sys.dm_os_sys_info osi + OPTION(MAXDOP 1, RECOMPILE); END; /*Checking for low memory indicators*/ @@ -13065,9 +13100,162 @@ OPTION(MAXDOP 1, RECOMPILE);', ); END; + SELECT + @cache_sql += N' + SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; + + SELECT + @cache_xml = + x.c + FROM + ( + SELECT TOP (20) + name = + CASE + WHEN domcc.name LIKE N''%UserStore%'' + THEN N''UserStore'' + WHEN domcc.name LIKE N''ObjPerm%'' + THEN N''ObjPerm'' + ELSE domcc.name + END, + pages_gb = + CONVERT + ( + decimal(38, 2), + SUM + (' + + CASE + @pages_kb + WHEN 1 + THEN N' + domcc.pages_kb' + ELSE N' + domcc.single_pages_kb + + domcc.multi_pages_kb' + END + N' + ) / 1024. / 1024. + ), + pages_in_use_gb = + ISNULL + ( + CONVERT + ( + decimal(38, 2), + SUM + (' + + CASE + @pages_kb + WHEN 1 + THEN N' + domcc.pages_in_use_kb' + ELSE N' + domcc.single_pages_in_use_kb + + domcc.multi_pages_in_use_kb' + END + N' + ) / 1024. / 1024. + ), + N''0.00'' + ), + entries_count = + REPLACE + ( + CONVERT + ( + nvarchar(30), + CONVERT + ( + money, + SUM(domcc.entries_count) + ), + 1 + ), + N''.00'', + N'''' + ), + entries_in_use_count = + REPLACE + ( + CONVERT + ( + nvarchar(30), + CONVERT + ( + money, + SUM(domcc.entries_in_use_count) + ), + 1 + ), + N''.00'', + N'''' + ) + FROM sys.dm_os_memory_cache_counters AS domcc + WHERE domcc.name NOT IN + ( + N''msdb'', + N''model_replicatedmaster'', + N''model_msdb'', + N''model'', + N''master'', + N''mssqlsystemresource'' + ) + GROUP BY + CASE + WHEN domcc.name LIKE N''%UserStore%'' + THEN N''UserStore'' + WHEN domcc.name LIKE N''ObjPerm%'' + THEN N''ObjPerm'' + ELSE domcc.name + END + HAVING + SUM + (' + + CASE + @pages_kb + WHEN 1 + THEN N' + domcc.pages_in_use_kb' + ELSE N' + domcc.single_pages_in_use_kb + + domcc.multi_pages_in_use_kb' + END + N' + ) / 1024. / 1024. > 0.5 + ORDER BY + pages_gb DESC + FOR XML + PATH(''cache''), + TYPE + ) AS x (c) + OPTION(MAXDOP 1, RECOMPILE); + ' + + IF @debug = 1 + BEGIN + RAISERROR('%s', 0, 1, @cache_sql) WITH NOWAIT; + END; + + EXEC sys.sp_executesql + @cache_sql, + N'@cache_xml xml OUTPUT', + @cache_xml OUTPUT; + + IF @cache_xml IS NULL + BEGIN + SELECT + @cache_xml = + ( + SELECT + N'No significant caches detected' + FOR XML + PATH(N'cache'), + TYPE + ); + END; + SELECT low_memory = - @low_memory; + @low_memory, + cache_memory = + @cache_xml; SELECT @memory_grant_cap = @@ -14184,8 +14372,8 @@ END; These are for your outputs. */ SELECT - @version = '4.5', - @version_date = '20240401'; + @version = '4.7', + @version_date = '20240701'; /* Helpful section! For help. @@ -20769,22 +20957,30 @@ FROM qsrs.executions_per_second, qsrs.avg_duration_ms, qsrs.total_duration_ms, + qsrs.max_duration_ms, qsrs.avg_cpu_time_ms, qsrs.total_cpu_time_ms, + qsrs.max_cpu_time_ms, qsrs.avg_logical_io_reads_mb, qsrs.total_logical_io_reads_mb, + qsrs.max_logical_io_reads_mb, qsrs.avg_logical_io_writes_mb, qsrs.total_logical_io_writes_mb, + qsrs.max_logical_io_writes_mb, qsrs.avg_physical_io_reads_mb, qsrs.total_physical_io_reads_mb, + qsrs.max_physical_io_reads_mb, qsrs.avg_clr_time_ms, qsrs.total_clr_time_ms, + qsrs.max_clr_time_ms, qsrs.min_dop, qsrs.max_dop, qsrs.avg_query_max_used_memory_mb, qsrs.total_query_max_used_memory_mb, + qsrs.max_query_max_used_memory_mb, qsrs.avg_rowcount, - qsrs.total_rowcount,' + qsrs.total_rowcount, + qsrs.max_rowcount,' + CASE @new WHEN 1 @@ -20792,10 +20988,13 @@ FROM N' qsrs.avg_num_physical_io_reads_mb, qsrs.total_num_physical_io_reads_mb, + qsrs.max_num_physical_io_reads_mb, qsrs.avg_log_bytes_used_mb, qsrs.total_log_bytes_used_mb, + qsrs.max_log_bytes_used_mb, qsrs.avg_tempdb_space_used_mb, - qsrs.total_tempdb_space_used_mb,' + qsrs.total_tempdb_space_used_mb, + qsrs.max_tempdb_space_used_mb,' ELSE N'' END + @@ -20962,22 +21161,30 @@ FROM executions_per_second = FORMAT(qsrs.executions_per_second, ''N0''), avg_duration_ms = FORMAT(qsrs.avg_duration_ms, ''N0''), total_duration_ms = FORMAT(qsrs.total_duration_ms, ''N0''), + max_duration_ms = FORMAT(qsrs.max_duration_ms, ''N0''), avg_cpu_time_ms = FORMAT(qsrs.avg_cpu_time_ms, ''N0''), total_cpu_time_ms = FORMAT(qsrs.total_cpu_time_ms, ''N0''), + max_cpu_time_ms = FORMAT(qsrs.max_cpu_time_ms, ''N0''), avg_logical_io_reads_mb = FORMAT(qsrs.avg_logical_io_reads_mb, ''N0''), total_logical_io_reads_mb = FORMAT(qsrs.total_logical_io_reads_mb, ''N0''), + max_logical_io_reads_mb = FORMAT(qsrs.max_logical_io_reads_mb, ''N0''), avg_logical_io_writes_mb = FORMAT(qsrs.avg_logical_io_writes_mb, ''N0''), total_logical_io_writes_mb = FORMAT(qsrs.total_logical_io_writes_mb, ''N0''), + max_logical_io_writes_mb = FORMAT(qsrs.max_logical_io_writes_mb, ''N0''), avg_physical_io_reads_mb = FORMAT(qsrs.avg_physical_io_reads_mb, ''N0''), total_physical_io_reads_mb = FORMAT(qsrs.total_physical_io_reads_mb, ''N0''), + max_physical_io_reads_mb = FORMAT(qsrs.max_physical_io_reads_mb, ''N0''), avg_clr_time_ms = FORMAT(qsrs.avg_clr_time_ms, ''N0''), total_clr_time_ms = FORMAT(qsrs.total_clr_time_ms, ''N0''), + max_clr_time_ms = FORMAT(qsrs.max_clr_time_ms, ''N0''), min_dop = FORMAT(qsrs.min_dop, ''N0''), max_dop = FORMAT(qsrs.max_dop, ''N0''), avg_query_max_used_memory_mb = FORMAT(qsrs.avg_query_max_used_memory_mb, ''N0''), total_query_max_used_memory_mb = FORMAT(qsrs.total_query_max_used_memory_mb, ''N0''), + max_query_max_used_memory_mb = FORMAT(qsrs.max_query_max_used_memory_mb, ''N0''), avg_rowcount = FORMAT(qsrs.avg_rowcount, ''N0''), - total_rowcount = FORMAT(qsrs.total_rowcount, ''N0''),' + total_rowcount = FORMAT(qsrs.total_rowcount, ''N0''), + max_rowcount = FORMAT(qsrs.max_rowcount, ''N0''),' + CASE @new WHEN 1 @@ -20985,10 +21192,13 @@ FROM N' avg_num_physical_io_reads_mb = FORMAT(qsrs.avg_num_physical_io_reads_mb, ''N0''), total_num_physical_io_reads_mb = FORMAT(qsrs.total_num_physical_io_reads_mb, ''N0''), + max_num_physical_io_reads_mb = FORMAT(qsrs.max_num_physical_io_reads_mb, ''N0''), avg_log_bytes_used_mb = FORMAT(qsrs.avg_log_bytes_used_mb, ''N0''), total_log_bytes_used_mb = FORMAT(qsrs.total_log_bytes_used_mb, ''N0''), + max_log_bytes_used_mb = FORMAT(qsrs.max_log_bytes_used_mb, ''N0''), avg_tempdb_space_used_mb = FORMAT(qsrs.avg_tempdb_space_used_mb, ''N0''), - total_tempdb_space_used_mb = FORMAT(qsrs.total_tempdb_space_used_mb, ''N0''),' + total_tempdb_space_used_mb = FORMAT(qsrs.total_tempdb_space_used_mb, ''N0''), + max_tempdb_space_used_mb = FORMAT(qsrs.max_tempdb_space_used_mb, ''N0''),' ELSE N'' END + @@ -21061,8 +21271,9 @@ FROM FROM #query_store_query AS qsq JOIN #query_store_query_text AS qsqt ON qsqt.query_text_id = qsq.query_text_id + AND qsqt.database_id = qsq.database_id WHERE qsq.query_id = qsp.query_id - AND qsq.query_id = qsp.query_id + AND qsq.database_id = qsp.database_id ORDER BY qsq.last_execution_time DESC ) AS qsqt @@ -21213,16 +21424,16 @@ ORDER BY ' + WHEN 1 THEN CASE @sort_order - WHEN 'cpu' THEN N'CONVERT(money, x.avg_cpu_time_ms)' - WHEN 'logical reads' THEN N'CONVERT(money, x.avg_logical_io_reads_mb)' - WHEN 'physical reads' THEN N'CONVERT(money, x.avg_physical_io_reads_mb)' - WHEN 'writes' THEN N'CONVERT(money, x.avg_logical_io_writes_mb)' - WHEN 'duration' THEN N'CONVERT(money, x.avg_duration_ms)' - WHEN 'memory' THEN N'CONVERT(money, x.avg_query_max_used_memory_mb)' - WHEN 'tempdb' THEN CASE WHEN @new = 1 THEN N'CONVERT(money, x.avg_tempdb_space_used_mb)' ELSE N'CONVERT(money, x.avg_cpu_time)' END - WHEN 'executions' THEN N'CONVERT(money, x.count_executions)' + WHEN 'cpu' THEN N'TRY_PARSE(x.avg_cpu_time_ms AS money)' + WHEN 'logical reads' THEN N'TRY_PARSE(x.avg_logical_io_reads_mb AS money)' + WHEN 'physical reads' THEN N'TRY_PARSE(x.avg_physical_io_reads_mb AS money)' + WHEN 'writes' THEN N'TRY_PARSE(x.avg_logical_io_writes_mb AS money)' + WHEN 'duration' THEN N'TRY_PARSE(x.avg_duration_ms AS money)' + WHEN 'memory' THEN N'TRY_PARSE(x.avg_query_max_used_memory_mb AS money)' + WHEN 'tempdb' THEN CASE WHEN @new = 1 THEN N'TRY_PARSE(x.avg_tempdb_space_used_mb AS money)' ELSE N'TRY_PARSE(x.avg_cpu_time AS money)' END + WHEN 'executions' THEN N'TRY_PARSE(x.count_executions AS money)' WHEN 'recent' THEN N'x.last_execution_time' - ELSE N'CONVERT(money, x.avg_cpu_time_ms)' + ELSE N'TRY_PARSE(x.avg_cpu_time_ms AS money)' END END + N' DESC diff --git a/sp_HumanEvents/sp_HumanEventsBlockViewer.sql b/sp_HumanEvents/sp_HumanEventsBlockViewer.sql index 3835c7c..2e75ab3 100644 --- a/sp_HumanEvents/sp_HumanEventsBlockViewer.sql +++ b/sp_HumanEvents/sp_HumanEventsBlockViewer.sql @@ -1146,9 +1146,9 @@ BEGIN deqs.min_used_threads, deqs.max_used_threads, deqs.total_rows, - max_worker_time_ms = + max_worker_time_ms = deqs.max_worker_time / 1000., - max_elapsed_time_ms = + max_elapsed_time_ms = deqs.max_elapsed_time / 1000. INTO #dm_exec_query_stats_sh FROM sys.dm_exec_query_stats AS deqs @@ -1968,9 +1968,9 @@ SELECT deqs.min_used_threads, deqs.max_used_threads, deqs.total_rows, - max_worker_time_ms = + max_worker_time_ms = deqs.max_worker_time / 1000., - max_elapsed_time_ms = + max_elapsed_time_ms = deqs.max_elapsed_time / 1000. INTO #dm_exec_query_stats FROM sys.dm_exec_query_stats AS deqs diff --git a/sp_LogHunter/sp_LogHunter.sql b/sp_LogHunter/sp_LogHunter.sql index d23bb92..92e813e 100644 --- a/sp_LogHunter/sp_LogHunter.sql +++ b/sp_LogHunter/sp_LogHunter.sql @@ -1,4 +1,4 @@ -SET ANSI_NULLS ON; +SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET ARITHABORT ON; @@ -10,20 +10,20 @@ SET STATISTICS TIME, IO OFF; GO /* -██╗ ██████╗ ██████╗ -██║ ██╔═══██╗██╔════╝ -██║ ██║ ██║██║ ███╗ -██║ ██║ ██║██║ ██║ -███████╗╚██████╔╝╚██████╔╝ -╚══════╝ ╚═════╝ ╚═════╝ - +██╗ ██████╗ ██████╗ +██║ ██╔═══██╗██╔════╝ +██║ ██║ ██║██║ ███╗ +██║ ██║ ██║██║ ██║ +███████╗╚██████╔╝╚██████╔╝ +╚══════╝ ╚═════╝ ╚═════╝ + ██╗ ██╗██╗ ██╗███╗ ██╗████████╗███████╗██████╗ ██║ ██║██║ ██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗ ███████║██║ ██║██╔██╗ ██║ ██║ █████╗ ██████╔╝ ██╔══██║██║ ██║██║╚██╗██║ ██║ ██╔══╝ ██╔══██╗ ██║ ██║╚██████╔╝██║ ╚████║ ██║ ███████╗██║ ██║ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ - + Copyright 2024 Darling Data, LLC https://www.erikdarling.com/ @@ -42,10 +42,10 @@ EXEC sp_LogHunter; */ -IF OBJECT_ID('dbo.sp_LogHunter') IS NULL - BEGIN - EXEC ('CREATE PROCEDURE dbo.sp_LogHunter AS RETURN 138;'); - END; +IF OBJECT_ID('dbo.sp_LogHunter') IS NULL + BEGIN + EXEC ('CREATE PROCEDURE dbo.sp_LogHunter AS RETURN 138;'); + END; GO ALTER PROCEDURE @@ -65,9 +65,9 @@ ALTER PROCEDURE ) WITH RECOMPILE AS -SET STATISTICS XML OFF; +SET STATISTICS XML OFF; SET NOCOUNT ON; -SET XACT_ABORT ON; +SET XACT_ABORT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; BEGIN @@ -83,7 +83,7 @@ BEGIN SELECT 'you can use me to look through your error logs for bad stuff' UNION ALL SELECT 'all scripts and documentation are available here: https://github.com/erikdarlingdata/DarlingData/tree/main/sp_LogHunter' UNION ALL SELECT 'from your loving sql server consultant, erik darling: https://erikdarling.com'; - + SELECT parameter_name = ap.name, @@ -138,38 +138,38 @@ BEGIN AND ap.user_type_id = t.user_type_id WHERE o.name = N'sp_LogHunter' OPTION(RECOMPILE); - + SELECT mit_license_yo = 'i am MIT licensed, so like, do whatever' - + UNION ALL - + SELECT mit_license_yo = 'see printed messages for full license'; - + RAISERROR(' MIT License - + Copyright 2024 Darling Data, LLC - + https://www.erikdarling.com/ - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ', 0, 1) WITH NOWAIT; - + RETURN; END; - + /*Check if we have sa permissisions*/ IF ( @@ -215,7 +215,7 @@ BEGIN RAISERROR(N'%i is not not a valid language_id in sys.messages.', 11, 1, @language_id) WITH NOWAIT; RETURN; END; - + /*Fix days back a little bit*/ IF @days_back = 0 BEGIN @@ -228,7 +228,7 @@ BEGIN SELECT @days_back *= -1; END; - + IF @start_date IS NOT NULL AND @end_date IS NOT NULL AND @days_back IS NOT NULL @@ -277,7 +277,7 @@ BEGIN @t_searches int = 0 /*total number of searches to run*/, @l_count int = 1 /*loop count*/, @stopper bit = 0 /*stop loop execution safety*/; - + /*temp tables for holding temporary things*/ CREATE TABLE #error_log @@ -286,7 +286,7 @@ BEGIN process_info nvarchar(100), text nvarchar(4000) ); - + CREATE TABLE #enum ( @@ -357,7 +357,7 @@ BEGIN AND e.archive > 0 OPTION(RECOMPILE); END; - + /*filter out log files we won't use, if @start_date and @end_date are set*/ IF @start_date IS NOT NULL AND @end_date IS NOT NULL @@ -466,7 +466,7 @@ BEGIN N'"' + CONVERT(nvarchar(30), @end_date) + N'"' ) AS c WHERE @custom_message_only = 0 - OPTION(RECOMPILE); + OPTION(RECOMPILE); /*deal with a custom search string here*/ INSERT @@ -499,7 +499,7 @@ BEGIN BEGIN SELECT table_name = '#search', s.* FROM #search AS s; END; - + /*Set the min and max logs we're getting for the loop*/ SELECT @l_log = MIN(e.archive), @@ -516,7 +516,7 @@ BEGIN END; IF @debug = 1 BEGIN RAISERROR('Declaring cursor', 0, 1) WITH NOWAIT; END; - + /*start the loops*/ WHILE @l_log <= @h_log BEGIN @@ -531,17 +531,17 @@ BEGIN SELECT command FROM #search; - + IF @debug = 1 BEGIN RAISERROR('Opening cursor', 0, 1) WITH NOWAIT; END; - + OPEN c; - + FETCH FIRST FROM c INTO @c; IF @debug = 1 BEGIN RAISERROR('Entering WHILE loop', 0, 1) WITH NOWAIT; END; - WHILE @@FETCH_STATUS = 0 AND @stopper = 0 + WHILE @@FETCH_STATUS = 0 AND @stopper = 0 BEGIN IF @debug = 1 BEGIN RAISERROR('Entering cursor', 0, 1) WITH NOWAIT; END; /*Replace the canary value with the log number we're working in*/ @@ -558,9 +558,9 @@ BEGIN BEGIN RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; RAISERROR('search %i of %i', 0, 1, @l_count, @t_searches) WITH NOWAIT; - RAISERROR('@c: %s', 0, 1, @c) WITH NOWAIT; + RAISERROR('@c: %s', 0, 1, @c) WITH NOWAIT; END; - + IF @debug = 1 BEGIN RAISERROR('Inserting to error log', 0, 1) WITH NOWAIT; END; BEGIN BEGIN TRY @@ -585,10 +585,10 @@ BEGIN VALUES ( @c - ); + ); END CATCH; END; - + IF @debug = 1 BEGIN RAISERROR('Fetching next', 0, 1) WITH NOWAIT; END; /*Get the next search command*/ FETCH NEXT @@ -600,7 +600,7 @@ BEGIN @l_count += 1; END; - + IF @debug = 1 BEGIN RAISERROR('Getting next log', 0, 1) WITH NOWAIT; END; /*Increment the log numbers*/ SELECT @@ -612,18 +612,18 @@ BEGIN IF @debug = 1 BEGIN - RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; + RAISERROR('log %i of %i', 0, 1, @l_log, @h_log) WITH NOWAIT; END; /*Stop the loop if this is NULL*/ IF @l_log IS NULL BEGIN - IF @debug = 1 BEGIN RAISERROR('Breaking', 0, 1) WITH NOWAIT; END; + IF @debug = 1 BEGIN RAISERROR('Breaking', 0, 1) WITH NOWAIT; END; SET @stopper = 1; BREAK; - END; + END; IF @debug = 1 BEGIN RAISERROR('Ended WHILE loop', 0, 1) WITH NOWAIT; END; - + /*Close out the cursor*/ CLOSE c; DEALLOCATE c; @@ -679,7 +679,7 @@ BEGIN 1/0 FROM #errors AS e ) - BEGIN + BEGIN SELECT table_name = '#errors', diff --git a/sp_PressureDetector/sp_PressureDetector.sql b/sp_PressureDetector/sp_PressureDetector.sql index 441cb94..c386783 100644 --- a/sp_PressureDetector/sp_PressureDetector.sql +++ b/sp_PressureDetector/sp_PressureDetector.sql @@ -686,8 +686,8 @@ OPTION(MAXDOP 1, RECOMPILE);', ( dows.wait_type = N'SLEEP_TASK' AND ISNULL(CONVERT(decimal(38, 2), dows.wait_time_ms / - NULLIF(1.* dows.waiting_tasks_count, 0.)), 0.) >= - CASE WHEN @sample_seconds > 0 THEN 0. ELSE 1000. END + NULLIF(1.* dows.waiting_tasks_count, 0.)), 0.) >= + CASE WHEN @sample_seconds > 0 THEN 0. ELSE 1000. END ) ) AND @@ -1887,14 +1887,14 @@ OPTION(MAXDOP 1, RECOMPILE);', SELECT @cache_sql += N' SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; - + SELECT - @cache_xml = + @cache_xml = x.c FROM ( SELECT TOP (20) - name = + name = CASE WHEN domcc.name LIKE N''%UserStore%'' THEN N''UserStore'' @@ -1902,14 +1902,14 @@ OPTION(MAXDOP 1, RECOMPILE);', THEN N''ObjPerm'' ELSE domcc.name END, - pages_gb = + pages_gb = CONVERT ( - decimal(38, 2), + decimal(38, 2), SUM (' + CASE - @pages_kb + @pages_kb WHEN 1 THEN N' domcc.pages_kb' @@ -1919,7 +1919,7 @@ OPTION(MAXDOP 1, RECOMPILE);', END + N' ) / 1024. / 1024. ), - pages_in_use_gb = + pages_in_use_gb = ISNULL ( CONVERT @@ -1928,7 +1928,7 @@ OPTION(MAXDOP 1, RECOMPILE);', SUM (' + CASE - @pages_kb + @pages_kb WHEN 1 THEN N' domcc.pages_in_use_kb' @@ -1940,20 +1940,20 @@ OPTION(MAXDOP 1, RECOMPILE);', ), N''0.00'' ), - entries_count = + entries_count = REPLACE ( CONVERT ( - nvarchar(30), + nvarchar(30), CONVERT ( - money, + money, SUM(domcc.entries_count) ), 1 - ), - N''.00'', + ), + N''.00'', N'''' ), entries_in_use_count = @@ -1961,15 +1961,15 @@ OPTION(MAXDOP 1, RECOMPILE);', ( CONVERT ( - nvarchar(30), + nvarchar(30), CONVERT ( - money, + money, SUM(domcc.entries_in_use_count) ), 1 - ), - N''.00'', + ), + N''.00'', N'''' ) FROM sys.dm_os_memory_cache_counters AS domcc @@ -1994,7 +1994,7 @@ OPTION(MAXDOP 1, RECOMPILE);', SUM (' + CASE - @pages_kb + @pages_kb WHEN 1 THEN N' domcc.pages_in_use_kb' @@ -2011,12 +2011,12 @@ OPTION(MAXDOP 1, RECOMPILE);', ) AS x (c) OPTION(MAXDOP 1, RECOMPILE); ' - + IF @debug = 1 BEGIN RAISERROR('%s', 0, 1, @cache_sql) WITH NOWAIT; END; - + EXEC sys.sp_executesql @cache_sql, N'@cache_xml xml OUTPUT', @@ -2034,13 +2034,13 @@ OPTION(MAXDOP 1, RECOMPILE);', TYPE ); END; - + SELECT low_memory = @low_memory, - cache_memory = + cache_memory = @cache_xml; - + SELECT @memory_grant_cap = ( diff --git a/sp_QuickieStore/sp_QuickieStore.sql b/sp_QuickieStore/sp_QuickieStore.sql index 6f35aad..e31538e 100644 --- a/sp_QuickieStore/sp_QuickieStore.sql +++ b/sp_QuickieStore/sp_QuickieStore.sql @@ -1168,7 +1168,7 @@ DECLARE @start_date_original datetimeoffset(7), @end_date_original datetimeoffset(7), @utc_minutes_difference bigint, - @utc_minutes_original bigint, + @utc_offset_string nvarchar(6), @df integer, @work_start_utc time(0), @work_end_utc time(0); @@ -1586,13 +1586,18 @@ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;', SYSDATETIME(), SYSUTCDATETIME() ), - @utc_minutes_original = - DATEDIFF - ( - MINUTE, - SYSUTCDATETIME(), - SYSDATETIME() - ), + /* + There is no direct way to get the user's timezone in a + format compatible with sys.time_zone_info. + + We also cannot directly get their UTC offset, + so we need this hack to get it instead. + + This is to make our datetimeoffsets have the + correct offset in cases where the user didn't + give us their timezone. + */ + @utc_offset_string = RIGHT(SYSDATETIMEOFFSET(), 6), @df = @@DATEFIRST, @work_start_utc = @work_start, @work_end_utc = @work_end; @@ -6234,11 +6239,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.first_execution_time + SWITCHOFFSET + ( + qsrs.first_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.first_execution_time AT TIME ZONE @timezone @@ -6249,11 +6253,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.last_execution_time + SWITCHOFFSET + ( + qsrs.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.last_execution_time AT TIME ZONE @timezone @@ -6462,11 +6465,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.first_execution_time + SWITCHOFFSET + ( + qsrs.first_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.first_execution_time AT TIME ZONE @timezone @@ -6477,11 +6479,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.last_execution_time + SWITCHOFFSET + ( + qsrs.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.last_execution_time AT TIME ZONE @timezone @@ -6688,11 +6689,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.first_execution_time + SWITCHOFFSET + ( + qsrs.first_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.first_execution_time AT TIME ZONE @timezone @@ -6703,11 +6703,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.last_execution_time + SWITCHOFFSET + ( + qsrs.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.last_execution_time AT TIME ZONE @timezone @@ -6892,11 +6891,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.first_execution_time + SWITCHOFFSET + ( + qsrs.first_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.first_execution_time AT TIME ZONE @timezone @@ -6907,11 +6905,10 @@ FROM CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qsrs.last_execution_time + SWITCHOFFSET + ( + qsrs.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsrs.last_execution_time AT TIME ZONE @timezone @@ -7212,9 +7209,9 @@ OPTION(RECOMPILE);' EXEC sys.sp_executesql @sql, - N'@utc_minutes_original bigint, + N'@utc_offset_string nvarchar(6), @timezone sysname', - @utc_minutes_original, + @utc_offset_string, @timezone; END; /*End runtime stats main query*/ ELSE @@ -7267,12 +7264,11 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qspf.create_time - ) + SWITCHOFFSET + ( + qspf.create_time, + @utc_offset_string + ) WHEN @timezone IS NOT NULL THEN qspf.create_time AT TIME ZONE @timezone END, @@ -7282,12 +7278,11 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD - ( - MINUTE, - @utc_minutes_original, - qspf.last_updated_time - ) + SWITCHOFFSET + ( + qspf.last_updated_time, + @utc_offset_string + ) WHEN @timezone IS NOT NULL THEN qspf.last_updated_time AT TIME ZONE @timezone END, @@ -7395,11 +7390,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.initial_compile_start_time + qsq.initial_compile_start_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.initial_compile_start_time AT TIME ZONE @timezone @@ -7410,11 +7404,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.last_compile_start_time + qsq.last_compile_start_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.last_compile_start_time AT TIME ZONE @timezone @@ -7425,11 +7418,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.last_execution_time + qsq.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.last_execution_time AT TIME ZONE @timezone @@ -7858,11 +7850,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qspf.create_time + qsq.create_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qspf.create_time AT TIME ZONE @timezone @@ -7873,11 +7864,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qspf.last_updated_time + qspf.last_updated_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qspf.last_updated_time AT TIME ZONE @timezone @@ -7986,11 +7976,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.initial_compile_start_time + qsq.initial_compile_start_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.initial_compile_start_time AT TIME ZONE @timezone @@ -8001,11 +7990,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.last_compile_start_time + qsq.last_compile_start_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.last_compile_start_time AT TIME ZONE @timezone @@ -8016,11 +8004,10 @@ BEGIN CASE WHEN @timezone IS NULL THEN - DATEADD + SWITCHOFFSET ( - MINUTE, - @utc_minutes_original, - qsq.last_execution_time + qsq.last_execution_time, + @utc_offset_string ) WHEN @timezone IS NOT NULL THEN qsq.last_execution_time AT TIME ZONE @timezone @@ -8774,14 +8761,14 @@ BEGIN @timezone, utc_minutes_difference = @utc_minutes_difference, - utc_minutes_original = - @utc_minutes_original, - df = - @df, - work_start_utc = - @work_start_utc, - work_end_utc = - @work_end_utc; + utc_offset_string = + @utc_offset_string, + df = + @df, + work_start_utc = + @work_start_utc, + work_end_utc = + @work_end_utc; IF EXISTS (