scripts/collector/sqlserver/sql/indexList.sql (179 lines of code) (raw):

/* Copyright 2023 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ SET NOCOUNT ON; SET LANGUAGE us_english; DECLARE @PKEY AS VARCHAR(256) DECLARE @CLOUDTYPE AS VARCHAR(256) DECLARE @ASSESSMENT_DATABSE_NAME AS VARCHAR(256) DECLARE @PRODUCT_VERSION AS INTEGER DECLARE @validDB AS INTEGER DECLARE @DMA_SOURCE_ID AS VARCHAR(256) DECLARE @DMA_MANUAL_ID AS VARCHAR(256) SELECT @PKEY = N'$(pkey)'; SELECT @CLOUDTYPE = 'NONE' SELECT @ASSESSMENT_DATABSE_NAME = N'$(database)'; SELECT @PRODUCT_VERSION = CONVERT(INTEGER, PARSENAME(CONVERT(NVARCHAR(255), SERVERPROPERTY('productversion')), 4)); SELECT @validDB = 0; SELECT @DMA_SOURCE_ID = N'$(dmaSourceId)'; SELECT @DMA_MANUAL_ID = N'$(dmaManualId)'; IF @ASSESSMENT_DATABSE_NAME = 'all' SELECT @ASSESSMENT_DATABSE_NAME = '%' IF UPPER(@@VERSION) LIKE '%AZURE%' SELECT @CLOUDTYPE = 'AZURE' BEGIN BEGIN SELECT @validDB = COUNT(1) FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb','distribution','reportserver', 'reportservertempdb','resource','rdsadmin') AND name like @ASSESSMENT_DATABSE_NAME AND state = 0 AND is_read_only = 0 END BEGIN TRY IF @validDB <> 0 BEGIN exec (' WITH sys_schemas AS ( SELECT name, schema_id FROM sys.schemas ), sys_views AS ( SELECT v.*, s.name AS schema_name FROM sys.views v LEFT JOIN sys_schemas s ON v.schema_id = s.schema_id ), index_computed_cols AS ( SELECT distinct i.object_id, i.name as index_name, s.name as schema_name, t.name as table_name, 1 as is_computed_index FROM sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id JOIN sys.computed_columns cc ON ic.object_id = cc.object_id and ic.column_id = cc.column_id JOIN sys.objects o ON o.object_id = i.object_id AND o.is_ms_shipped = 0 JOIN sys.tables t ON i.object_id = t.object_id AND t.is_ms_shipped = 0 JOIN sys.schemas s ON s.schema_id = t.schema_id ) SELECT ''"' + @PKEY + '"'' AS pkey, ''"'' + CONVERT(NVARCHAR(MAX), DB_NAME()) + ''"'' as database_name, CASE WHEN s.name IS NULL THEN ''"'' + CONVERT(NVARCHAR(MAX), v.schema_name) + ''"'' ELSE ''"'' + CONVERT(NVARCHAR(MAX), s.name) + ''"'' END as schema_name, CASE WHEN t.name IS NULL THEN ''"'' + CONVERT(NVARCHAR(MAX), v.name) + ''"'' ELSE ''"'' + CONVERT(NVARCHAR(MAX), t.name) + ''"'' END as table_name, ''"'' + CONVERT(NVARCHAR(MAX), i.name) + ''"'' as index_name, ''"'' + CONVERT(NVARCHAR(MAX), i.type_desc) + ''"'' as index_type, ''"'' + CONVERT(NVARCHAR(MAX), i.is_primary_key) + ''"'' as is_primary_key, ''"'' + CONVERT(NVARCHAR(MAX), i.is_unique) + ''"'' as is_unique, ''"'' + CONVERT(NVARCHAR(MAX), i.fill_factor) + ''"'' as fille_factor, ''"'' + CONVERT(NVARCHAR(MAX), i.allow_page_locks) + ''"'' as allow_page_locks, ''"'' + CONVERT(NVARCHAR(MAX), i.has_filter) + ''"'' as has_filter, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(p.data_compression,0)) + ''"'' as data_compression, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(p.data_compression_desc,''NONE'')) + ''"'' as data_compression_desc, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(ps.name, ''Not Partitioned'')) + ''"'' as partition_scheme, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(SUM(ic.key_ordinal),0)) + ''"'' as count_key_ordinal, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(SUM(ic.partition_ordinal),0)) + ''"'' as count_partition_ordinal, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(SUM(CONVERT(int,ic.is_included_column)),0)) + ''"'' as count_is_included_column, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(CONVERT(NVARCHAR(255), ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)),0)) + ''"'' as total_space_mb, ''"' + @DMA_SOURCE_ID + '"'' as dma_source_id, ''"' + @DMA_MANUAL_ID + '"'' as dma_manual_id, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL(icc.is_computed_index,0)) + ''"'' as is_computed_index, CASE WHEN v.name IS NOT NULL THEN ''"1"'' ELSE ''"0"'' END as is_index_on_view FROM sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id JOIN sys.objects o ON o.object_id = i.object_id AND o.is_ms_shipped = 0 LEFT JOIN sys.tables t ON i.object_id = t.object_id AND t.is_ms_shipped = 0 LEFT JOIN sys_views v ON i.object_id = v.object_id AND v.is_ms_shipped = 0 LEFT JOIN sys_schemas s ON (s.schema_id = t.schema_id) LEFT JOIN sys.partitions AS p ON (p.object_id = i.object_id AND p.index_id = i.index_id) LEFT JOIN sys.allocation_units AS a ON (a.container_id = p.partition_id) LEFT JOIN sys.partition_schemes ps ON (i.data_space_id = ps.data_space_id) LEFT JOIN index_computed_cols icc ON (i.object_id = icc.object_id and i.name = icc.index_name and icc.table_name = t.name and icc.schema_name = s.name) WHERE i.NAME is not NULL GROUP BY CASE WHEN s.name IS NULL THEN ''"'' + CONVERT(NVARCHAR(MAX), v.schema_name) + ''"'' ELSE ''"'' + CONVERT(NVARCHAR(MAX), s.name) + ''"'' END ,CASE WHEN t.name IS NULL THEN ''"'' + CONVERT(NVARCHAR(MAX), v.name) + ''"'' ELSE ''"'' + CONVERT(NVARCHAR(MAX), t.name) + ''"'' END ,i.name ,i.type_desc ,i.is_primary_key ,i.is_unique ,i.fill_factor ,i.allow_page_locks ,i.has_filter ,ISNULL (p.data_compression,0) ,ISNULL (p.data_compression_desc,''NONE'') ,ISNULL (ps.name, ''Not Partitioned'') ,ISNULL (icc.is_computed_index,0) ,CASE WHEN v.name IS NOT NULL THEN ''"1"'' ELSE ''"0"'' END UNION SELECT ''"' + @PKEY + '"'' AS pkey, ''"'' + CONVERT(NVARCHAR(MAX), DB_NAME()) + ''"'' as database_name, ''"'' + CONVERT(NVARCHAR(MAX), s.name) + ''"'' as schema_name, ''"'' + CONVERT(NVARCHAR(MAX), t.name) + ''"'' as table_name, ''"'' + CONVERT(NVARCHAR(MAX), o.name) + ''"'' as index_name, ''"FULLTEXT"'' as index_type, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as is_primary_key, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as is_unique, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as fill_factor, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as allow_page_locks, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as has_filter, ''"'' + CONVERT(NVARCHAR(MAX), p.data_compression) + ''"'' as data_compression, ''"'' + CONVERT(NVARCHAR(MAX), p.data_compression_desc) + ''"'' as data_compression_desc, ''"'' + CONVERT(NVARCHAR(MAX), ISNULL (ps.name, ''Not Partitioned'')) + ''"'' as partition_scheme, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as count_key_ordinal, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as count_partition_ordinal, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as count_is_included_column, ''"'' + CONVERT(NVARCHAR(MAX), CONVERT(NVARCHAR(255), ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2))) + ''"'' as total_space_mb, ''"' + @DMA_SOURCE_ID + '"'' as dma_source_id, ''"' + @DMA_MANUAL_ID + '"'' as dma_manual_id, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as is_computed_index, ''"'' + CONVERT(NVARCHAR(MAX), 0) + ''"'' as is_index_on_view FROM sys.fulltext_indexes fi JOIN sys.objects o on (o.object_id = fi.object_id) JOIN sys.fulltext_index_columns ic ON fi.object_id = ic.object_id LEFT JOIN sys.tables t ON fi.object_id = t.object_id AND t.is_ms_shipped = 0 LEFT JOIN sys_schemas s ON s.schema_id = t.schema_id LEFT JOIN sys.partitions AS p ON p.object_id = fi.object_id LEFT JOIN sys.allocation_units AS a ON a.container_id = p.partition_id LEFT JOIN sys.partition_schemes ps ON fi.data_space_id = ps.data_space_id GROUP BY s.name, t.name, o.name, p.data_compression, p.data_compression_desc, ISNULL (ps.name, ''Not Partitioned'')'); END; END TRY BEGIN CATCH SELECT host_name() as host_name, db_name() as database_name, 'indexList' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_MESSAGE()),1,512) as error_message; END CATCH END;