2010-01-19 10 views
84

¿Cómo podría encontrar los objetos más grandes en una base de datos de SQL Server? Primero, al determinar qué tablas (e índices relacionados) son las más grandes y luego determinar qué filas en una tabla en particular son más grandes (estamos almacenando datos binarios en BLOB).¿Cómo encontrar los objetos más grandes en una base de datos de SQL Server?

¿Existen herramientas para ayudar con este tipo de análisis de bases de datos? ¿O hay algunas consultas simples que podría ejecutar contra las tablas del sistema?

Respuesta

203

He estado usando esta secuencia de comandos SQL (que obtuve de alguien, en algún lugar - no puedo reconstruir de quién vino) durante años y me ayudó bastante a comprender y determinar el tamaño de índices y tablas:

SELECT 
    t.NAME AS TableName, 
    i.name as indexName, 
    sum(p.rows) as RowCounts, 
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages, 
    (sum(a.total_pages) * 8)/1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8)/1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8)/1024 as DataSpaceMB 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
    t.NAME NOT LIKE 'dt%' AND 
    i.OBJECT_ID > 255 AND 
    i.index_id <= 1 
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    object_name(i.object_id) 

Por supuesto, puede utilizar otros criterios de pedido, por ejemplo

ORDER BY SUM(p.rows) DESC 

para obtener las tablas con el mayor número de filas, o

ORDER BY SUM(a.total_pages) DESC 

para obtener las tablas con el mayor número de páginas (8K bloques) utilizados.

+0

Excelente, ¡gracias! Ahora, que he reducido mi objeto más grande a una tabla que contiene una gran cantidad de datos binarios, de todos modos para averiguar cuál de las filas de datos binarios son las más grandes. – jamesaharvey

+3

para eso, tendría que hacer una selección en esa tabla e imprimir DATALENGTH (campo) para cada campo que le interese (generalmente VARCHAR (MAX), VARBINARIO (MAX) y así sucesivamente) –

+0

Excelente, gracias ¡de nuevo! – jamesaharvey

2

Si está utilizando Sql Server Management Studio 2008, hay ciertos campos de datos que puede ver en la ventana de detalles del explorador de objetos. Simplemente busque y seleccione la carpeta de tablas. En la vista de detalles, puede hacer clic con el botón derecho en los títulos de las columnas y agregar campos al "informe". Su millaje puede variar si está en SSMS 2008 express.

3

Usted puede también utilizar el siguiente código:

USE AdventureWork 
GO 
CREATE TABLE #GetLargest 
(
    table_name sysname , 
    row_count  INT, 
    reserved_size VARCHAR(50), 
    data_size  VARCHAR(50), 
    index_size VARCHAR(50), 
    unused_size VARCHAR(50) 
) 

SET NOCOUNT ON 

INSERT #GetLargest 

EXEC sp_msforeachtable 'sp_spaceused ''?''' 

SELECT 
    a.table_name, 
    a.row_count, 
    COUNT(*) AS col_count, 
    a.data_size 
    FROM #GetLargest a 
    INNER JOIN information_schema.columns b 
    ON a.table_name collate database_default 
    = b.table_name collate database_default 
     GROUP BY a.table_name, a.row_count, a.data_size 
     ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC 

DROP TABLE #GetLargest 
2

que he encontrado esta consulta también es muy útil para SqlServerCentral, aquí está el enlace a la publicación original

Sql Server largest tables

select name=object_schema_name(object_id) + '.' + object_name(object_id) 
, rows=sum(case when index_id < 2 then row_count else 0 end) 
, reserved_kb=8*sum(reserved_page_count) 
, data_kb=8*sum(case 
    when index_id<2 then in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count 
    else lob_used_page_count + row_overflow_used_page_count 
    end) 
, index_kb=8*(sum(used_page_count) 
    - sum(case 
      when index_id<2 then in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count 
     else lob_used_page_count + row_overflow_used_page_count 
     end) 
    )  
, unused_kb=8*sum(reserved_page_count-used_page_count) 
from sys.dm_db_partition_stats 
where object_id > 1024 
group by object_id 
order by 
rows desc 

En mi base de datos dieron diferentes resultados entre esta consulta y la primera respuesta.

Esperanza alguien lo encuentra útil ayuda

+0

¡Esto fue genial gracias! – ADL

3

Esta consulta para encontrar mesa más grande que estás conexión.

SELECT TOP 1 OBJECT_NAME(OBJECT_ID) TableName, st.row_count 
FROM sys.dm_db_partition_stats st 
WHERE index_id < 2 
ORDER BY st.row_count DESC 
+0

Es bueno tener algo que podamos memorizar fácilmente. Gracias por la concisión. –

34

En SQL Server 2008, también puede ejecutar el informe estándar Uso del disco por tablas principales. Puede encontrarlo en haciendo clic con el botón derecho en DB, seleccionando Informes-> Informes estándar y seleccionando el informe que desea.

+4

¿No es broma? Esa es una respuesta revolucionaria. Gracias por publicarlo (No es sarcasmo. He estado ejecutando estas consultas de forma manual durante un tiempo y no puedo creer que estos informes ya estén allí). –

Cuestiones relacionadas