tamaño - Cómo obtener el recuento de filas para todas las tablas en una base de datos del SERVIDOR SQL
tamaño de todas las bases de datos sql server (13)
Aquí hay un enfoque de SQL dinámico que también le da el esquema también:
DECLARE @sql nvarchar(MAX)
SELECT
@sql = COALESCE(@sql + '' UNION ALL '', '''') +
''SELECT
'''''' + s.name + '''''' AS ''''Schema'''',
'''''' + t.name + '''''' AS ''''Table'''',
COUNT(*) AS Count
FROM '' + QUOTENAME(s.name) + ''.'' + QUOTENAME(t.name)
FROM sys.schemas s
INNER JOIN sys.tables t ON t.schema_id = s.schema_id
ORDER BY
s.name,
t.name
EXEC(@sql)
Si fuera necesario, sería trivial extender esto para ejecutar todas las bases de datos en la instancia (unirse a sys.databases
).
Esta pregunta ya tiene una respuesta aquí:
Estoy buscando un script SQL que pueda usarse para determinar si hay datos (es decir, recuento de filas) en cualquiera de las tablas de una base de datos determinada.
La idea es reencarnar la base de datos en caso de que haya filas existentes (en cualquiera de las bases de datos).
La base de datos de la que se habla es Microsoft SQL SERVER
.
¿Podría alguien sugerir una secuencia de comandos de muestra?
Corto y dulce
sp_MSForEachTable ''DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''''?'''' FROM ? ; PRINT @t''
Salida:
El siguiente SQL le proporcionará el número de filas de todas las tablas en una base de datos:
CREATE TABLE #counts
(
table_name varchar(255),
row_count int
)
EXEC sp_MSForEachTable @command1=''INSERT #counts (table_name, row_count) SELECT ''''?'''', COUNT(*) FROM ?''
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts
La salida será una lista de tablas y sus recuentos de filas.
Si solo desea que el número total de filas en toda la base de datos, agregue:
SELECT SUM(row_count) AS total_row_count FROM #counts
obtendrá un único valor para el número total de filas en toda la base de datos.
Esta es mi solución favorita para SQL 2008, que coloca los resultados en una tabla temporal "TEST" que puedo usar para ordenar y obtener los resultados que necesito:
SET NOCOUNT ON
DBCC UPDATEUSAGE(0)
DROP TABLE #t;
CREATE TABLE #t
(
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
) ;
INSERT #t EXEC sp_msForEachTable ''EXEC sp_spaceused ''''?''''''
SELECT * INTO TEST FROM #t;
DROP TABLE #t;
SELECT name, [rows], reserved, data, index_size, unused FROM TEST /
WHERE ([rows] > 0) AND (name LIKE ''XXX%'')
Este se ve mejor que los otros, creo.
USE [enter your db name here]
GO
SELECT SCHEMA_NAME(A.schema_id) + ''.'' +
A.Name, SUM(B.rows) AS ''RowCount''
FROM sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE A.type = ''U''
GROUP BY A.schema_id, A.Name
GO
Funciona en Azure, no requiere procs almacenados.
SELECT t.name, s.row_count from sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.object_id = s.object_id
AND t.type_desc = ''USER_TABLE''
AND t.name not like ''%dss%''
AND s.index_id IN (0,1)
Haría un pequeño cambio en la solución de Frederik. Yo usaría el procedimiento almacenado del sistema sp_spaceused que también incluirá datos y tamaños de índice.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = ''sp_spaceused '' + @tablename
exec sp_executesql @stmt
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
No use SELECT COUNT(*) FROM TABLENAME
, ya que es una operación que requiere SELECT COUNT(*) FROM TABLENAME
recursos. Uno debe usar las vistas de administración dinámica de SQL Server o los catálogos del sistema para obtener la información de conteo de filas para todas las tablas en una base de datos.
SQL Server 2005 o posterior ofrece un buen informe que muestra los tamaños de las tablas, incluidos los recuentos de filas, etc. Está en Informes estándar, y es el uso del disco por tabla.
Programáticamente, hay una buena solución en: http://www.sqlservercentral.com/articles/T-SQL/67624/
Si desea pasar el tiempo y los recursos necesarios para contar (*) sus tablas de 3 millones de filas. Pruebe esto por SQL SERVER Central de Kendal Van Dyke.
Recuentos de filas usando sysindexes Si está utilizando SQL 2000, necesitará usar sysindexes así:
-- Shows all user tables and row counts for the current database
-- Remove OBJECTPROPERTY function call to include system objects
SELECT o.NAME,
i.rowcnt
FROM sysindexes AS i
INNER JOIN sysobjects AS o ON i.id = o.id
WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, ''IsMSShipped'') = 0
ORDER BY o.NAME
Si está utilizando SQL 2005 o 2008, los sysindexes de consulta seguirán funcionando, pero Microsoft recomienda que los sysindexes se eliminen en una versión futura de SQL Server, por lo que, como buena práctica, debería utilizar los DMV, por lo tanto:
-- Shows all user tables and row counts for the current database
-- Remove is_ms_shipped = 0 check to include system objects
-- i.index_id < 2 indicates clustered index (1) or hash table (0)
SELECT o.name,
ddps.row_count
FROM sys.indexes AS i
INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
AND i.index_id = ddps.index_id
WHERE i.index_id < 2 AND o.is_ms_shipped = 0 ORDER BY o.NAME
seleccione todas las filas de la vista information_schema.tables y emita una instrucción count (*) para cada entrada que se haya devuelto desde esa vista.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = ''select @rowcount = count(*) from '' + @tablename
exec sp_executesql @stmt, N''@rowcount int output'', @rowcount=@rowcount OUTPUT
print N''table: '' + @tablename + '' has '' + convert(nvarchar(1000),@rowcount) + '' rows''
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
SELECT
sc.name +''.''+ ta.name TableName, SUM(pa.rows) RowCnt
FROM
sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC
SELECT
SUM(sdmvPTNS.row_count) AS [DBRows]
FROM
sys.objects AS sOBJ
INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
ON sOBJ.object_id = sdmvPTNS.object_id
WHERE
sOBJ.type = ''U''
AND sOBJ.is_ms_shipped = 0
AND sdmvPTNS.index_id < 2
GO