Files
sql-scripts/OCTPDBA-365 Check index usage stats of [Entry] table/clean up index to drop.sql
Thierry Schork 7cf858256a initial commit
2022-12-30 12:10:12 +01:00

166 lines
8.1 KiB
PL/PgSQL

/*
Server: sun791aps.sunstore.ch
Format: GCM
Business: TPPHAR
type: PROD
Version: 21.3.11111.00064
02.11.2022, TSC
*/
USE [Arizona];
BEGIN TRANSACTION;
SET XACT_ABORT ON;
SET NOCOUNT ON;
DECLARE @index_to_drop TABLE ([columns_in_index] VARCHAR(MAX) NOT NULL,
[index_name] VARCHAR(500) NULL);
INSERT @index_to_drop ([columns_in_index])
VALUES ('ET_APS_TS'),
('ET_entry_address'),
('ET_entry_type'),
('ET_master_ID'),
('ET_predefined_entry'),
('ET_sales_tax_code'),
('ET_bmc_user_profile'),
('ET_currency');
/* find index name with defined columns */
WITH [ColInfo]
AS (SELECT [o].[name] AS [TblName],
[s].[name] + '.' + [o].[name] AS [SchemaTbl],
[i].[name] AS [IndexName],
[i].[is_primary_key] AS [IsPrimaryKey],
[i].[is_unique_constraint] AS [IsUniqueConstraint],
[i].[is_unique] AS [IsUnique],
[c].[name] AS [ColName],
[c].[is_computed] AS [IsComputedCol],
[ic].[is_included_column] AS [IsIncludedCol],
[ic].[key_ordinal],
[i].[filter_definition] AS [FilterDefinition],
CHAR(13) + CHAR(10) AS [crlf],
';' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) AS [crlfgo]
FROM [sys].[objects] [o]
INNER JOIN [sys].[schemas] [s]
ON [o].[schema_id] = [s].[schema_id]
INNER JOIN [sys].[columns] [c]
ON [o].[object_id] = [c].[object_id]
INNER JOIN [sys].[indexes] [i]
ON [c].[object_id] = [i].[object_id]
INNER JOIN [sys].[index_columns] [ic]
ON [i].[index_id] = [ic].[index_id]
AND [o].[object_id] = [ic].[object_id]
AND [c].[column_id] = [ic].[column_id]
WHERE [o].[name] = 'entry'
--AND i.filter_definition IS NOT NULL
)
--SELECT itd.columns_in_index
-- ,itd.index_name
-- ,lst.IndexName
-- ,lst.IndexColumns
-- ,lst.IncludedColumns
UPDATE [itd]
SET [itd].[index_name] = [lst].[IndexName]
FROM ( SELECT DISTINCT [x].[TblName],
[x].[IndexName],
[x].[IsPrimaryKey],
[x].[IsUniqueConstraint],
[x].[IsUnique],
--,size.IndexSizeKB
[c].[IndexColumns],
[ci].[IncludedColumns],
[cc].[ComputedColumns],
[x].[FilterDefinition],
[x].[crlf] + '-- ' + [x].[IndexName] + [x].[crlf] +
--check drop
'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + [x].[IndexName]
+ ''' , ''IndexID'' ) IS NOT NULL BEGIN;' + [x].[crlf]
+ CASE
WHEN [x].[IsPrimaryKey] = 1 THEN NULL
WHEN [x].[IsUniqueConstraint] = 1 THEN
--drop statement
' ALTER TABLE ' + [x].[SchemaTbl] + ' DROP CONSTRAINT ' + [x].[IndexName] + ';'
+ [x].[crlf] + 'END' + [x].[crlfgo]
--check create
+ 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + [x].[IndexName]
+ ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +
--create statement
+' ALTER TABLE '
+ [x].[SchemaTbl] + ' ADD CONSTRAINT ' + [x].[IndexName] + ' UNIQUE ('
+ [c].[IndexColumns] + ');' + [x].[crlf] + 'END' + [x].[crlfgo]
ELSE
--drop statement
' DROP INDEX ' + [x].[SchemaTbl] + '.' + [x].[IndexName] + ';' + [x].[crlf]
+ 'END' + [x].[crlfgo]
--check create
+ 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + [x].[IndexName]
+ ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +
--create statement
+' CREATE '
+ CASE
WHEN [x].[IsUnique] = 1 THEN 'UNIQUE '
ELSE '' END + 'INDEX ' + [x].[IndexName] + ' ON ' + [x].[SchemaTbl] + '('
+ [c].[IndexColumns] + ')'
+ ISNULL(' INCLUDE(' + [ci].[IncludedColumns] + ')', '')
+ ISNULL(' WHERE ' + [x].[FilterDefinition], '') + ';' + [x].[crlf] + 'END'
+ [x].[crlfgo] END AS [DropCreateSQL]
FROM [ColInfo] [x]
CROSS APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [IndexColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 0
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [c]
OUTER APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [IncludedColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 1
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [ci]
OUTER APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [ComputedColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsComputedCol] = 1
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [cc] ) [lst]
INNER JOIN @index_to_drop [itd]
ON [lst].[IndexColumns] = [itd].[columns_in_index];
SELECT *
FROM @index_to_drop [itd];
/* declare variables */
DECLARE @index_name VARCHAR(MAX);
DECLARE [drop_index] CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT [itd].[index_name]
FROM @index_to_drop [itd]
WHERE [itd].[index_name] IS NOT NULL;
OPEN [drop_index];
FETCH NEXT FROM [drop_index]
INTO @index_name;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('DROP INDEX ' + @index_name + ' ON dbo.entry;');
FETCH NEXT FROM [drop_index]
INTO @index_name;
END;
CLOSE [drop_index];
DEALLOCATE [drop_index];
ROLLBACK TRANSACTION;