2011-03-04 20 views
7

¿Cómo contar o saber el número de filas que tiene una tabla sin escanear toda la tabla, quizás usando ROW_NUMBER?número de filas SQL Server

+1

que no quieres decir como select count (*) de la tabla ¿verdad? – CloudyMarble

+0

recuento (clave principal) no escaneará toda la tabla, así que no tema usarla. Verifique mi respuesta para obtener información más detallada. – MestreLion

+2

@MestreLion - ** escaneará ** toda la tabla. Con un IC, el nivel de hoja ** es ** la tabla. Necesita escanear las páginas de las hojas, ya que esta información no está disponible en los niveles superiores (las páginas de nivel intermedio solo tienen una tecla y un puntero por cada ** página ** en el nivel inferior, no tienen información sobre cuántas filas contiene cada página secundaria)) –

Respuesta

16

Si necesita un recuento exacto, tendrá que hacer un COUNT(*) que escanear el índice agrupado.

Usted puede obtener un cálculo aproximado utilizando el esquema sys.partitions, como se muestra aquí http://www.kodyaz.com/articles/sql-rowcount-using-sql-server-system-view-sys-partitions.aspx

Actualización: Para obtener el recuento en una variable:

DECLARE @cnt INT; 
SELECT @cnt = SUM(rows) 
FROM sys.partitions 
WHERE 
    index_id IN (0, 1) 
    AND object_id = OBJECT_ID('MyDB.dbo.MyTable'); 
SELECT @cnt; 
+3

+1 La única respuesta hasta el momento para abordar la parte "sin explorar toda la tabla" de la pregunta. –

+0

I rojo la información en el enlace, dice que es rápido utilizar la vista del sistema SQL Server (sys.partitions). ¿Sabes si supera el conteo de selecciones (*) de la tabla? Digamos una tabla con muchas filas (> 100,000,000)? – cMinor

+0

@darkcminor: lo superará fácilmente, ya que solo tiene que recuperar un número de las tablas del sistema en lugar de escanear y contar 100 millones de filas. (probablemente x00,000 lecturas lógicas dependiendo de la cantidad de filas en una página) –

3
SELECT COUNT(*) FROM Table 

devolverá el número de filas

+2

Esto ** ** escaneará toda la tabla .... –

0

yo no cree que quiere decir esto, pero mal darle una oportunidad:

select count(*) from table 
+1

De nuevo: ** escaneará ** toda la tabla (no se recomienda para tablas con millones de filas ...) –

1

no hay ROW_NUMBER en SQL Server, Oracle acaba. Uso:

SELECT COUNT(primary_key) FROM table 

Dónde primary key la columna de clave principal de la tabla.

Desde su clave primaria, su ya está indexada, por lo que SQL puede contar sin escanear toda la tabla (que utiliza un índice agrupado para ser precisos, que es mucho más rápido que un escaneo completo de tabla)

También podría usar el esquema sys.indexes, pero no es exacto, y necesitaría privilegios de administrador de base de datos para acceder, y su base de datos de usuario no debe tener concesiones en ese esquema

+0

COUNT (PK) es en realidad más lento que COUNT (*) – Simon

+0

@simon Lo dudo mucho. ¿Puedes proporcionar un código de muestra donde sea más lento? –

+0

@Simon: no veo por qué, dado que internamente SQL usa el índice de clave principal para contar las filas, se usa COUNT (*). Si se utiliza el mismo índice para ambos recuentos, el rendimiento debería ser bastante similar, si no es el mismo. – MestreLion

3

Un poco tarde para la fiesta aquí, pero en SQL Server 2005 en, también puede usar el procedimiento almacenado sp_spaceused:

DECLARE @rowCount AS INT 
DECLARE @spaceUsed TABLE(
    [Name] varchar(64), 
    [Rows] INT, 
    [Reserved] VARCHAR(50), 
    [Data] VARCHAR(50), 
    [Index_Size] VARCHAR(50), 
    [Unused] VARCHAR(50) 
) 
INSERT INTO @spaceUsed EXEC sp_spaceused 'MyTableName' 
SET @rowCount = (SELECT TOP 1 [Rows] FROM @spaceUsed) 
SELECT @rowCount AS 'Row Count' 

Me he acostumbrado a usar sp_spaceused en lugar de porque es mucho más rápido. Sin embargo, lo más probable es que no sea tan preciso como COUNT (*).

MSDN: http://msdn.microsoft.com/en-us/library/ms188776.aspx

Cuestiones relacionadas