diff --git a/DWH - indexes to change 26.9.25.sql b/DWH - indexes to change 26.9.25.sql new file mode 100644 index 0000000..4addcbd --- /dev/null +++ b/DWH - indexes to change 26.9.25.sql @@ -0,0 +1,94 @@ +USE bi_dm +GO +/* Add missing include columns */ +-- NCIX_DM_Sale_Sale_pharmacy_SAL_doc_number +--IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Sale'), 'NCIX_DM_Sale_Sale_pharmacy_SAL_doc_number' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.DM_Sale.NCIX_DM_Sale_Sale_pharmacy_SAL_doc_number; +--END; +-- GO +-- IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Sale'), 'NCIX_DM_Sale_Sale_pharmacy_SAL_doc_number' , 'IndexID' ) IS NULL BEGIN; + -- CREATE INDEX NCIX_DM_Sale_Sale_pharmacy_SAL_doc_number ON dbo.DM_Sale(Sale_pharmacy, SAL_doc_number) + -- INCLUDE( + -- Sale_ID, SAL_value_date, SAL_pharmacode, SAL_quantity, SAL_amount_VAT, SAL_discount, SAL_prescription, + -- SAL_prescription_number, SAL_original_prescription_number, SAL_prescriber_CAMS_code, SAL_insurance, + -- SAL_posology, SAL_turnover_type, SAL_correction_ID, + -- [SAL_text], [SAL_linked_sale_id], [SAL_original_date], [SAL_prescription_pharmacy] + -- ); +-- END; +-- GO + + +/* create missing index */ +-- NCIX_DM_Prescriber_CAMS_code +--IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Prescriber'), 'NCIX_DM_Prescriber_CAMS_code' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.DM_Prescriber.NCIX_DM_Prescriber_CAMS_code; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Prescriber'), 'NCIX_DM_Prescriber_CAMS_code' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX NCIX_DM_Prescriber_CAMS_code ON dbo.DM_Prescriber(PRESC_CAMS_code) +-- INCLUDE(PRESC_name); +--END; +--GO + +/* Create missing index */ +-- -- NCIX_DM_Sale_COL_Sale_pharmacy_Sale_id +-- IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Sale'), 'NCIX_DM_Sale_COL_Sale_pharmacy_Sale_id' , 'IndexID' ) IS NOT NULL BEGIN; + -- DROP INDEX dbo.DM_Sale.NCIX_DM_Sale_COL_Sale_pharmacy_Sale_id; +-- END; +-- GO +-- IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Sale'), 'NCIX_DM_Sale_COL_Sale_pharmacy_Sale_id' , 'IndexID' ) IS NULL BEGIN; + -- CREATE INDEX NCIX_DM_Sale_COL_Sale_pharmacy_Sale_id ON dbo.DM_Sale(Sale_pharmacy, Sale_ID) INCLUDE(SAL_operation_code,SAL_correction_id); +-- END; +-- GO + + +/* Create missing index */ +-- NCIX_DM_item_Phcode_tarif_type +--IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Item'), 'NCIX_DM_item_Phcode_tarif_type' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.DM_Item.NCIX_DM_item_Phcode_tarif_type; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.DM_Item'), 'NCIX_DM_item_Phcode_tarif_type' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX NCIX_DM_item_Phcode_tarif_type ON dbo.DM_Item(Item_pharmacode, IT_PH_tarif_type); +--END; +--GO + + +USE [BI_BAS] +GO +/* Create missing index */ +---- IDX_BAS_T1_ORGANIZATIONAL_UNIT_ORGANIZATIONAL_id_sub_code +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_ORGANIZATIONAL_UNIT'), 'IDX_BAS_T1_ORGANIZATIONAL_UNIT_ORGANIZATIONAL_id_sub_code' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.BAS_T1_ORGANIZATIONAL_UNIT.IDX_BAS_T1_ORGANIZATIONAL_UNIT_ORGANIZATIONAL_id_sub_code; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_ORGANIZATIONAL_UNIT'), 'IDX_BAS_T1_ORGANIZATIONAL_UNIT_ORGANIZATIONAL_id_sub_code' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX IDX_BAS_T1_ORGANIZATIONAL_UNIT_ORGANIZATIONAL_id_sub_code ON dbo.BAS_T1_ORGANIZATIONAL_UNIT(ORGANIZATIONAL_UNIT_SYSTEMINSTANCE_ID, OU_SUBSIDIARY) INCLUDE(OU_CODE); +--END; +--GO + +---- IDX_BAS_T1_DOCUMENT_TYPE_DTY_TYPE +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_DOCUMENT_TYPE'), 'IDX_BAS_T1_DOCUMENT_TYPE_covering' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.BAS_T1_DOCUMENT_TYPE.IDX_BAS_T1_DOCUMENT_TYPE_covering; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_DOCUMENT_TYPE'), 'IDX_BAS_T1_DOCUMENT_TYPE_covering' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX IDX_BAS_T1_DOCUMENT_TYPE_covering ON dbo.BAS_T1_DOCUMENT_TYPE(DTY_TYPE, [DOCUMENT_TYPE_ID], [DOCUMENT_TYPE_SYSTEMINSTANCE_ID]) +-- INCLUDE([DTY_DEBIT_CREDIT_CODE]); +--END; +--GO + +---- IDX_BAS_T1_PREDEFINED_ENTRY_PD_DOCUMENT_TYPE +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_PREDEFINED_ENTRY'), 'IDX_BAS_T1_PREDEFINED_ENTRY_PD_DOCUMENT_TYPE' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.BAS_T1_PREDEFINED_ENTRY.IDX_BAS_T1_PREDEFINED_ENTRY_PD_DOCUMENT_TYPE; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.BAS_T1_PREDEFINED_ENTRY'), 'IDX_BAS_T1_PREDEFINED_ENTRY_PD_DOCUMENT_TYPE' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX IDX_BAS_T1_PREDEFINED_ENTRY_PD_DOCUMENT_TYPE ON dbo.BAS_T1_PREDEFINED_ENTRY(PD_DOCUMENT_TYPE, [PREDEFINED_ENTRY_SYSTEMINSTANCE_ID]) +-- INCLUDE([PD_CODE]); +--END; +--GO + + + + diff --git a/EXPLOIT - list databases sizes.sql b/EXPLOIT - list databases sizes.sql index d065d61..a2439e4 100644 --- a/EXPLOIT - list databases sizes.sql +++ b/EXPLOIT - list databases sizes.sql @@ -41,7 +41,7 @@ SELECT * FROM #FileSize */ --the free space in MB that should be present in the files after shrinking -DECLARE @limit INT = 512; +DECLARE @limit INT = 1024; SELECT d.[name] AS dbName diff --git a/HCI - setup new PharmaceuticalSpecialties_Superset.sql b/HCI - setup new PharmaceuticalSpecialties_Superset.sql new file mode 100644 index 0000000..68f20c7 --- /dev/null +++ b/HCI - setup new PharmaceuticalSpecialties_Superset.sql @@ -0,0 +1,149 @@ +/* +PharmaceuticalSpecialties_Superset + +Wire the database Users to these new AD groups + + DEV L-CI-AP-SQL-D-HCI-PharmaceuticalSpecialties_Superset_R and L-CI-AP-SQL-D-HCI-PharmaceuticalSpecialties_Superset_RW + INT L-CI-AP-SQL-I-HCI-PharmaceuticalSpecialties_Superset_R and L-CI-AP-SQL-I-HCI-PharmaceuticalSpecialties_Superset_RW + PROD L-CI-AP-SQL-P-HCI-PharmaceuticalSpecialties_Superset_R and L-CI-AP-SQL-P-HCI-PharmaceuticalSpecialties_Superset_RW + +01.10.2025, TSC +*/ + +BEGIN TRANSACTION + +SET XACT_ABORT ON; +SET NOCOUNT ON; + +DECLARE @q NVARCHAR(MAX)=''; +DECLARE @db sysname='PharmaceuticalSpecialties_Superset'; +DECLARE @env VARCHAR(111); +DECLARE @groups TABLE(env VARCHAR(111) NOT NULL, grp_name VARCHAR(111) NOT NULL); +SELECT @env = CASE + WHEN @@SERVERNAME='SWMDATASQLDEV01' THEN 'dev' + WHEN @@SERVERNAME='SWMDATASQLINT01' THEN 'int' + WHEN @@SERVERNAME='SWMDATASQLPRD01' THEN 'prod' + WHEN @@SERVERNAME='SWSQLMDQAS05' THEN 'log' + ELSE 'unknown' +END; +DECLARE @tplLogins NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.server_principals + WHERE name = ''@grp@'' +) +BEGIN + SET @sql = + N''CREATE LOGIN [@grp@] '' + + N''FROM WINDOWS '' + + N''WITH DEFAULT_DATABASE=[master];''; + EXEC (@sql); + + PRINT ''created login [@grp@]''; +END + +'; +DECLARE @tplUser NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + CREATE USER [@grp@] + FOR LOGIN [@grp@]; + PRINT ''Added user [@grp@]''; +END + +IF EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + GRANT EXECUTE TO [@grp@]; + --PRINT ''Granted EXECUTE to [@grp@]''; + + ALTER ROLE [db_datareader] ADD MEMBER [@grp@] + --PRINT ''Granted db_datareader to [@grp@]''; + + PRINT ''Granted read and execute permissions to [@grp@]''; + IF ''@grp@'' like ''%[_]RW'' + BEGIN + ALTER ROLE [db_datawriter] ADD MEMBER [@grp@]; + PRINT ''Granted db_datawriter to [@grp@]''; + END + + +END + +' + +INSERT INTO @groups ([env],[grp_name]) +VALUES('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-PharmaceuticalSpecialties_Superset_R') + ,('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-PharmaceuticalSpecialties_Superset_RW') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-PharmaceuticalSpecialties_Superset_R') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-PharmaceuticalSpecialties_Superset_RW') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-PharmaceuticalSpecialties_Superset_R') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-PharmaceuticalSpecialties_Superset_RW') + +; +SELECT @env +IF @env IN ('dev','int','prod') +BEGIN + SET @q='use master +go +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +DECLARE @sql nvarchar(MAX)=''''; +'; + + --#region login + SELECT @q = @q + REPLACE(@tplLogins, '@grp@',g.[grp_name]) + FROM @groups g + WHERE [g].[env] = @env + AND g.[grp_name] LIKE '%\%'; + --#endregion login + + --#region users + SET @q = @q +' +use '+@db+' +GO + '; + + SELECT @q = @q + REPLACE(@tplUser,'@grp@', g.[grp_name]) + FROM @groups g + WHERE g.[env] = @env; + --#endregion users + + SET @q = @q +' +ROLLBACK TRANSACTION ' + PRINT '' + + --#region print whole dyn sql + DECLARE @String NVARCHAR(MAX) = @q + DECLARE @CurrentEnd BIGINT; /* track the length of the next substring */ + DECLARE @offset tinyint; /*tracks the amount of offset needed */ + set @string = replace( replace(@string, char(13) + char(10), char(10)) , char(13), char(10)) + + WHILE LEN(@String) > 1 + BEGIN + IF CHARINDEX(CHAR(10), @String) between 1 AND 4000 + BEGIN + SET @CurrentEnd = CHARINDEX(char(10), @String) -1 + set @offset = 2 + END + ELSE + BEGIN + SET @CurrentEnd = 4000 + set @offset = 1 + END + PRINT SUBSTRING(@String, 1, @CurrentEnd) + set @string = SUBSTRING(@String, @CurrentEnd+@offset, LEN(@String)) + END /*End While loop*/ + --#endregion print whole dyn sql +END + +ROLLBACK TRANSACTION \ No newline at end of file diff --git a/HCI - setup new partner_superset.sql b/HCI - setup new partner_superset.sql new file mode 100644 index 0000000..9f8b7d5 --- /dev/null +++ b/HCI - setup new partner_superset.sql @@ -0,0 +1,189 @@ +/* +partner_centralized_superset + +Wire the database Users to these new AD groups + + DEV L-CI-AP-SQL-D-HCI-Partner_Centralized_Superset_R and L-CI-AP-SQL-D-HCI-Partner_Centralized_Superset_RW + + INT L-CI-AP-SQL-I-HCI-Partner_Centralized_Superset_R and L-CI-AP-SQL-I-HCI-Partner_Centralized_Superset_RW + +Copy some other legacy groups/users/sql users from Partner_Superset on the new database partner_centralized_superset + +DEV only yellow marked groups from Partner_Superset + +25.09.2025, TSC +*/ + +BEGIN TRANSACTION + +SET XACT_ABORT ON; +SET NOCOUNT ON; + +DECLARE @q NVARCHAR(MAX)=''; +DECLARE @db sysname='partner_centralized_superset'; +DECLARE @env VARCHAR(111); +DECLARE @groups TABLE(env VARCHAR(111) NOT NULL, grp_name VARCHAR(111) NOT NULL); +SELECT @env = CASE + WHEN @@SERVERNAME='SWMDATASQLDEV01' THEN 'dev' + WHEN @@SERVERNAME='SWMDATASQLINT01' THEN 'int' + WHEN @@SERVERNAME='SWMDATASQLPRD01' THEN 'prod' + WHEN @@SERVERNAME='SWSQLMDQAS05' THEN 'log' + ELSE 'unknown' +END; +DECLARE @tplLogins NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.server_principals + WHERE name = ''@grp@'' +) +BEGIN + SET @sql = + N''CREATE LOGIN [@grp@] '' + + N''FROM WINDOWS '' + + N''WITH DEFAULT_DATABASE=[master];''; + EXEC (@sql); + + PRINT ''created login [@grp@]''; +END + +'; +DECLARE @tplUser NVARCHAR(MAX)=' +IF NOT EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + CREATE USER [@grp@] + FOR LOGIN [@grp@]; + PRINT ''Added user [@grp@]''; +END + +IF EXISTS ( + SELECT 1 + FROM sys.database_principals + WHERE name = N''@grp@'' +) +BEGIN + GRANT EXECUTE TO [@grp@]; + --PRINT ''Granted EXECUTE to [@grp@]''; + + ALTER ROLE [db_datareader] ADD MEMBER [@grp@] + --PRINT ''Granted db_datareader to [@grp@]''; + + PRINT ''Granted read and execute permissions to [@grp@]''; + IF ''@grp@'' like ''%[_]RW'' + BEGIN + ALTER ROLE [db_datawriter] ADD MEMBER [@grp@]; + PRINT ''Granted db_datawriter to [@grp@]''; + END + + +END + +' + +INSERT INTO @groups ([env],[grp_name]) +VALUES('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-Partner_Centralized_Superset_R') + ,('dev', 'CENTRALINFRA\L-CI-AP-SQL-D-HCI-Partner_Centralized_Superset_RW') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-Partner_Centralized_Superset_R') + ,('int', 'CENTRALINFRA\L-CI-AP-SQL-I-HCI-Partner_Centralized_Superset_RW') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-Partner_Centralized_Superset_R') + ,('prod', 'CENTRALINFRA\L-CI-AP-SQL-P-HCI-Partner_Centralized_Superset_RW') + + --specific groups to add on dev + ,('dev','CENTRALINFRA\L-CI-AP-SQL-DEV_MED_Team') + ,('dev','CENTRALINFRA\msa-IIS-EMedipI$') + ,('dev','CENTRALINFRA\svc-DoMe-Dev') + ,('dev','E-MEDIAT\au_cp2_int') + ,('dev','E-MEDIAT\au_documedis') + ,('dev','E-MEDIAT\au_MyProduct_int') + ,('dev','E-MEDIAT\au_ws_getpartner') + ,('dev','medicalData-importer-dev') + ,('dev','newrelic') + + --specific groups to add on int + ,('int','centralinfra\L-CI-AP-SQL-INT_MED_Team') + ,('int','CENTRALINFRA\msa-IIS-EMedipI$') + ,('int','CENTRALINFRA\svc-DoMe-Int') + ,('int','E-MEDIAT\au_cp2_int') + ,('int','E-MEDIAT\au_documedis') + ,('int','E-MEDIAT\au_MyProduct_int') + ,('int','E-MEDIAT\dbgrp_EMEVDB22_PARTNER_SUPERSET_R') + ,('int','medicalData-importer-int') + ,('int','newrelic') + + --specific groups to add on prod + ,('prod','CENTRALINFRA\L-CI-AP-SQL-PROD_MED_Team') + ,('prod','CENTRALINFRA\msa-IIS-EMedipP$') + ,('prod','CENTRALINFRA\svc-DoMe-Int') + ,('prod','E-MEDIAT\dbgrp_EMEVDB32_ ODB_Superset_R') + ,('prod','E-MEDIAT\au_documedis') + ,('prod','E-MEDIAT\au_MyProduct_Prod') + ,('prod','E-MEDIAT\au_ws_getpartner') + ,('prod','E-MEDIAT\dbgrp_EMEVDB32_MyProducts_RW') + ,('prod','E-MEDIAT\dbgrp_EMEVDB32_PARTNER_SUPERSET_R') + ,('prod','E-MEDIAT\L-EM-AP-SQL-EMEVDB32_Partner_Superset_R') + ,('prod','medicalData-importer-prod') + ,('prod','newrelic') + +; +SELECT @env +IF @env IN ('dev','int','prod') +BEGIN + SET @q='use master +go +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +DECLARE @sql nvarchar(MAX)=''''; +'; + + --#region login + SELECT @q = @q + REPLACE(@tplLogins, '@grp@',g.[grp_name]) + FROM @groups g + WHERE [g].[env] = @env + AND g.[grp_name] LIKE '%\%'; + --#endregion login + + --#region users + SET @q = @q +' +use '+@db+' +GO + '; + + SELECT @q = @q + REPLACE(@tplUser,'@grp@', g.[grp_name]) + FROM @groups g + WHERE g.[env] = @env; + --#endregion users + + SET @q = @q +' +ROLLBACK TRANSACTION ' + PRINT '' + + --#region print whole dyn sql + DECLARE @String NVARCHAR(MAX) = @q + DECLARE @CurrentEnd BIGINT; /* track the length of the next substring */ + DECLARE @offset tinyint; /*tracks the amount of offset needed */ + set @string = replace( replace(@string, char(13) + char(10), char(10)) , char(13), char(10)) + + WHILE LEN(@String) > 1 + BEGIN + IF CHARINDEX(CHAR(10), @String) between 1 AND 4000 + BEGIN + SET @CurrentEnd = CHARINDEX(char(10), @String) -1 + set @offset = 2 + END + ELSE + BEGIN + SET @CurrentEnd = 4000 + set @offset = 1 + END + PRINT SUBSTRING(@String, 1, @CurrentEnd) + set @string = SUBSTRING(@String, @CurrentEnd+@offset, LEN(@String)) + END /*End While loop*/ + --#endregion print whole dyn sql +END + +ROLLBACK TRANSACTION \ No newline at end of file diff --git a/Wait Statistics - Paul Randall - please tell me where it hurts.sql b/Wait Statistics - Paul Randall - please tell me where it hurts.sql new file mode 100644 index 0000000..2cfcc2c --- /dev/null +++ b/Wait Statistics - Paul Randall - please tell me where it hurts.sql @@ -0,0 +1,120 @@ +-- Last updated October 1, 2021 +WITH [Waits] AS + (SELECT + [wait_type], + [wait_time_ms] / 1000.0 AS [WaitS], + ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], + [signal_wait_time_ms] / 1000.0 AS [SignalS], + [waiting_tasks_count] AS [WaitCount], + 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], + ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] + FROM sys.dm_os_wait_stats + WHERE [wait_type] NOT IN ( + -- These wait types are almost 100% never a problem and so they are + -- filtered out to avoid them skewing the results. Click on the URL + -- for more information. + N'BROKER_EVENTHANDLER', -- https://www.sqlskills.com/help/waits/BROKER_EVENTHANDLER + N'BROKER_RECEIVE_WAITFOR', -- https://www.sqlskills.com/help/waits/BROKER_RECEIVE_WAITFOR + N'BROKER_TASK_STOP', -- https://www.sqlskills.com/help/waits/BROKER_TASK_STOP + N'BROKER_TO_FLUSH', -- https://www.sqlskills.com/help/waits/BROKER_TO_FLUSH + N'BROKER_TRANSMITTER', -- https://www.sqlskills.com/help/waits/BROKER_TRANSMITTER + N'CHECKPOINT_QUEUE', -- https://www.sqlskills.com/help/waits/CHECKPOINT_QUEUE + N'CHKPT', -- https://www.sqlskills.com/help/waits/CHKPT + N'CLR_AUTO_EVENT', -- https://www.sqlskills.com/help/waits/CLR_AUTO_EVENT + N'CLR_MANUAL_EVENT', -- https://www.sqlskills.com/help/waits/CLR_MANUAL_EVENT + N'CLR_SEMAPHORE', -- https://www.sqlskills.com/help/waits/CLR_SEMAPHORE + + -- Maybe comment this out if you have parallelism issues + N'CXCONSUMER', -- https://www.sqlskills.com/help/waits/CXCONSUMER + + -- Maybe comment these four out if you have mirroring issues + N'DBMIRROR_DBM_EVENT', -- https://www.sqlskills.com/help/waits/DBMIRROR_DBM_EVENT + N'DBMIRROR_EVENTS_QUEUE', -- https://www.sqlskills.com/help/waits/DBMIRROR_EVENTS_QUEUE + N'DBMIRROR_WORKER_QUEUE', -- https://www.sqlskills.com/help/waits/DBMIRROR_WORKER_QUEUE + N'DBMIRRORING_CMD', -- https://www.sqlskills.com/help/waits/DBMIRRORING_CMD + N'DIRTY_PAGE_POLL', -- https://www.sqlskills.com/help/waits/DIRTY_PAGE_POLL + N'DISPATCHER_QUEUE_SEMAPHORE', -- https://www.sqlskills.com/help/waits/DISPATCHER_QUEUE_SEMAPHORE + N'EXECSYNC', -- https://www.sqlskills.com/help/waits/EXECSYNC + N'FSAGENT', -- https://www.sqlskills.com/help/waits/FSAGENT + N'FT_IFTS_SCHEDULER_IDLE_WAIT', -- https://www.sqlskills.com/help/waits/FT_IFTS_SCHEDULER_IDLE_WAIT + N'FT_IFTSHC_MUTEX', -- https://www.sqlskills.com/help/waits/FT_IFTSHC_MUTEX + + -- Maybe comment these six out if you have AG issues + N'HADR_CLUSAPI_CALL', -- https://www.sqlskills.com/help/waits/HADR_CLUSAPI_CALL + N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', -- https://www.sqlskills.com/help/waits/HADR_FILESTREAM_IOMGR_IOCOMPLETION + N'HADR_LOGCAPTURE_WAIT', -- https://www.sqlskills.com/help/waits/HADR_LOGCAPTURE_WAIT + N'HADR_NOTIFICATION_DEQUEUE', -- https://www.sqlskills.com/help/waits/HADR_NOTIFICATION_DEQUEUE + N'HADR_TIMER_TASK', -- https://www.sqlskills.com/help/waits/HADR_TIMER_TASK + N'HADR_WORK_QUEUE', -- https://www.sqlskills.com/help/waits/HADR_WORK_QUEUE + + N'KSOURCE_WAKEUP', -- https://www.sqlskills.com/help/waits/KSOURCE_WAKEUP + N'LAZYWRITER_SLEEP', -- https://www.sqlskills.com/help/waits/LAZYWRITER_SLEEP + N'LOGMGR_QUEUE', -- https://www.sqlskills.com/help/waits/LOGMGR_QUEUE + N'MEMORY_ALLOCATION_EXT', -- https://www.sqlskills.com/help/waits/MEMORY_ALLOCATION_EXT + N'ONDEMAND_TASK_QUEUE', -- https://www.sqlskills.com/help/waits/ONDEMAND_TASK_QUEUE + N'PARALLEL_REDO_DRAIN_WORKER', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_DRAIN_WORKER + N'PARALLEL_REDO_LOG_CACHE', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_LOG_CACHE + N'PARALLEL_REDO_TRAN_LIST', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_TRAN_LIST + N'PARALLEL_REDO_WORKER_SYNC', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_WORKER_SYNC + N'PARALLEL_REDO_WORKER_WAIT_WORK', -- https://www.sqlskills.com/help/waits/PARALLEL_REDO_WORKER_WAIT_WORK + N'PREEMPTIVE_OS_FLUSHFILEBUFFERS', -- https://www.sqlskills.com/help/waits/PREEMPTIVE_OS_FLUSHFILEBUFFERS + N'PREEMPTIVE_XE_GETTARGETSTATE', -- https://www.sqlskills.com/help/waits/PREEMPTIVE_XE_GETTARGETSTATE + N'PVS_PREALLOCATE', -- https://www.sqlskills.com/help/waits/PVS_PREALLOCATE + N'PWAIT_ALL_COMPONENTS_INITIALIZED', -- https://www.sqlskills.com/help/waits/PWAIT_ALL_COMPONENTS_INITIALIZED + N'PWAIT_DIRECTLOGCONSUMER_GETNEXT', -- https://www.sqlskills.com/help/waits/PWAIT_DIRECTLOGCONSUMER_GETNEXT + N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', -- https://www.sqlskills.com/help/waits/PWAIT_EXTENSIBILITY_CLEANUP_TASK + N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', -- https://www.sqlskills.com/help/waits/QDS_PERSIST_TASK_MAIN_LOOP_SLEEP + N'QDS_ASYNC_QUEUE', -- https://www.sqlskills.com/help/waits/QDS_ASYNC_QUEUE + N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', + -- https://www.sqlskills.com/help/waits/QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP + N'QDS_SHUTDOWN_QUEUE', -- https://www.sqlskills.com/help/waits/QDS_SHUTDOWN_QUEUE + N'REDO_THREAD_PENDING_WORK', -- https://www.sqlskills.com/help/waits/REDO_THREAD_PENDING_WORK + N'REQUEST_FOR_DEADLOCK_SEARCH', -- https://www.sqlskills.com/help/waits/REQUEST_FOR_DEADLOCK_SEARCH + N'RESOURCE_QUEUE', -- https://www.sqlskills.com/help/waits/RESOURCE_QUEUE + N'SERVER_IDLE_CHECK', -- https://www.sqlskills.com/help/waits/SERVER_IDLE_CHECK + N'SLEEP_BPOOL_FLUSH', -- https://www.sqlskills.com/help/waits/SLEEP_BPOOL_FLUSH + N'SLEEP_DBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_DBSTARTUP + N'SLEEP_DCOMSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_DCOMSTARTUP + N'SLEEP_MASTERDBREADY', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERDBREADY + N'SLEEP_MASTERMDREADY', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERMDREADY + N'SLEEP_MASTERUPGRADED', -- https://www.sqlskills.com/help/waits/SLEEP_MASTERUPGRADED + N'SLEEP_MSDBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_MSDBSTARTUP + N'SLEEP_SYSTEMTASK', -- https://www.sqlskills.com/help/waits/SLEEP_SYSTEMTASK + N'SLEEP_TASK', -- https://www.sqlskills.com/help/waits/SLEEP_TASK + N'SLEEP_TEMPDBSTARTUP', -- https://www.sqlskills.com/help/waits/SLEEP_TEMPDBSTARTUP + N'SNI_HTTP_ACCEPT', -- https://www.sqlskills.com/help/waits/SNI_HTTP_ACCEPT + N'SOS_WORK_DISPATCHER', -- https://www.sqlskills.com/help/waits/SOS_WORK_DISPATCHER + N'SP_SERVER_DIAGNOSTICS_SLEEP', -- https://www.sqlskills.com/help/waits/SP_SERVER_DIAGNOSTICS_SLEEP + N'SQLTRACE_BUFFER_FLUSH', -- https://www.sqlskills.com/help/waits/SQLTRACE_BUFFER_FLUSH + N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', -- https://www.sqlskills.com/help/waits/SQLTRACE_INCREMENTAL_FLUSH_SLEEP + N'SQLTRACE_WAIT_ENTRIES', -- https://www.sqlskills.com/help/waits/SQLTRACE_WAIT_ENTRIES + N'VDI_CLIENT_OTHER', -- https://www.sqlskills.com/help/waits/VDI_CLIENT_OTHER + N'WAIT_FOR_RESULTS', -- https://www.sqlskills.com/help/waits/WAIT_FOR_RESULTS + N'WAITFOR', -- https://www.sqlskills.com/help/waits/WAITFOR + N'WAITFOR_TASKSHUTDOWN', -- https://www.sqlskills.com/help/waits/WAITFOR_TASKSHUTDOWN + N'WAIT_XTP_RECOVERY', -- https://www.sqlskills.com/help/waits/WAIT_XTP_RECOVERY + N'WAIT_XTP_HOST_WAIT', -- https://www.sqlskills.com/help/waits/WAIT_XTP_HOST_WAIT + N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', -- https://www.sqlskills.com/help/waits/WAIT_XTP_OFFLINE_CKPT_NEW_LOG + N'WAIT_XTP_CKPT_CLOSE', -- https://www.sqlskills.com/help/waits/WAIT_XTP_CKPT_CLOSE + N'XE_DISPATCHER_JOIN', -- https://www.sqlskills.com/help/waits/XE_DISPATCHER_JOIN + N'XE_DISPATCHER_WAIT', -- https://www.sqlskills.com/help/waits/XE_DISPATCHER_WAIT + N'XE_TIMER_EVENT' -- https://www.sqlskills.com/help/waits/XE_TIMER_EVENT + ) + AND [waiting_tasks_count] > 0 + ) +SELECT + MAX ([W1].[wait_type]) AS [WaitType], + CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S], + CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S], + CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S], + MAX ([W1].[WaitCount]) AS [WaitCount], + CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage], + CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S], + CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S], + CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S], + CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [Help/Info URL] +FROM [Waits] AS [W1] +INNER JOIN [Waits] AS [W2] ON [W2].[RowNum] <= [W1].[RowNum] +GROUP BY [W1].[RowNum] +HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold +GO \ No newline at end of file diff --git a/WaitingTasks.sql b/WaitingTasks.sql new file mode 100644 index 0000000..f5b13e7 --- /dev/null +++ b/WaitingTasks.sql @@ -0,0 +1,59 @@ +/*============================================================================ + File: WaitingTasks.sql + + Summary: Snapshot of waiting tasks + + SQL Server Versions: 2005 onwards +------------------------------------------------------------------------------ + Written by Paul S. Randal, SQLskills.com + + (c) 2016, SQLskills.com. All rights reserved. + + For more scripts and sample code, check out + http://www.SQLskills.com + + You may alter this code for your own *non-commercial* purposes. You may + republish altered code as long as you include this copyright and give due + credit, but you must obtain prior permission before blogging this code. + + THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF + ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED + TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + PARTICULAR PURPOSE. +============================================================================*/ +SELECT + [owt].[session_id] AS [SPID], + [owt].[exec_context_id] AS [Thread], + [ot].[scheduler_id] AS [Scheduler], + [owt].[wait_duration_ms] AS [wait_ms], + [owt].[wait_type], + [owt].[blocking_session_id] AS [Blocking SPID], + [owt].[resource_description], + CASE [owt].[wait_type] + WHEN N'CXPACKET' THEN + RIGHT ([owt].[resource_description], + CHARINDEX (N'=', REVERSE ([owt].[resource_description])) - 1) + ELSE NULL + END AS [Node ID], + [eqmg].[dop] AS [DOP], + [er].[database_id] AS [DBID], + CAST ('https://www.sqlskills.com/help/waits/' + [owt].[wait_type] as XML) AS [Help/Info URL], + [eqp].[query_plan], + [est].text +FROM sys.dm_os_waiting_tasks [owt] +INNER JOIN sys.dm_os_tasks [ot] ON + [owt].[waiting_task_address] = [ot].[task_address] +INNER JOIN sys.dm_exec_sessions [es] ON + [owt].[session_id] = [es].[session_id] +INNER JOIN sys.dm_exec_requests [er] ON + [es].[session_id] = [er].[session_id] +FULL JOIN sys.dm_exec_query_memory_grants [eqmg] ON + [owt].[session_id] = [eqmg].[session_id] +OUTER APPLY sys.dm_exec_sql_text ([er].[sql_handle]) [est] +OUTER APPLY sys.dm_exec_query_plan ([er].[plan_handle]) [eqp] +WHERE + [es].[is_user_process] = 1 +ORDER BY + [owt].[session_id], + [owt].[exec_context_id]; +GO \ No newline at end of file