Generar total de objetos por tipo de una base de datos.


Muchas veces tuvimos que obtener para informes estadísticos, el total de objetos que componen una base de datos especifica.
Aquí esta el script que puede facilitarnos esta tarea al momento de ser solicitada.

SELECT 
    CASE TYPE 
        WHEN 'U' 
            THEN 'User Defined Tables' 
        WHEN 'S'
            THEN 'System Tables'
        WHEN 'IT'
            THEN 'Internal Tables'
        WHEN 'P'
            THEN 'Stored Procedures'
        WHEN 'PC'
            THEN 'CLR Stored Procedures'
        WHEN 'X'
            THEN 'Extended Stored Procedures'
    END, 
    COUNT(*)     
FROM SYS.OBJECTS
WHERE TYPE IN ('U', 'P', 'PC', 'S', 'IT', 'X')
GROUP BY TYPE
UNION
SELECT 'Indexes', COUNT(*)  FROM sys.indexes

Total_Objects_CS

Identificar indices no usados


En algunas oportunidades de negocio, y en ciertas tareas, los desarrolladores crean nuevos indices sin investigar si realmente los indices existentes son suficientes para responder su consulta en tiempo y forma.
Ocasionalmente en lugar de modificar sus consultas para que usen alguno de los indices existentes observando el plan de ejecución, crean indices idénticos, o casi iguales.
La siguiente consulta no detecta la duplicidad de indices, el SQL Server se encarga solo de tomar el indice indicado para cada consulta, y en caso de que existiera alguno duplicado, el motor descarta a uno de los dos de manera natural.

La consulta para identificar estos casos es la siguiente:


SELECT
	sch.name + '.' + tbl.name			AS [Table Name], 
	ind.name						AS [Index Name], 
	ind.index_id					AS [Index_id],
	ind.type_desc,  
	ISNULL(user_seeks + user_scans 
		 + user_lookups,0)			AS [Total Reads
	ISNULL(user_updates,0)				AS [Total Writes], 
	ius.last_user_seek, 
	ius.last_user_scan ,
	ius.last_user_lookup,
	(ps.reserved_page_count*8.0)/1024	AS [SpaceUsed_MB] 
FROM sys.indexes AS ind  
FULL OUTER JOIN sys.dm_db_index_usage_stats AS ius	
	ON  ius.object_id	= ind.object_id  
	AND ius.index_id	= ind.index_id 
	AND ius.database_id	= db_id()  
	AND objectproperty(ius.object_id,'IsUserTable') = 1  
INNER JOIN		sys.tables			AS tbl
	ON ind.object_id = tbl.object_id
INNER JOIN		sys.schemas			AS sch
	ON tbl.schema_id = sch.schema_id
LEFT OUTER JOIN sys.dm_db_partition_stats	AS ps	
	ON ind.index_id = ps.index_id
	AND ind.object_id = ps.object_id
--WHERE ius.object_id = object_id('InvoicingUnits')
WHERE ISNULL(user_seeks + user_scans 
		 + user_lookups,0) = 0
ORDER BY [Table Name], [index name]

Espero les sirva.
Saludos!.