none
Número filas de tabla diferente a número de filas en llave primaria RRS feed

  • Pregunta

  • Buen día a todos.

    Tengo una tabla en SQL Server 2014 que contiene 534.279 filas.  Al mirar las propiedades de la llave primaria, me muestra 535.100 filas.  Ejecuté una reconstrucción del índice y quedó mostrando 535.600 filas.  Luego le apliqué un DBCC CHECKTABLE y quedó mostrando 532.800.

    A qué se debe que el número de filas mostrado por la llave primaria, sea diferente al número de filas mostrado en las propiedades de la tabla?.  Si esto es anormal, cómo puedo solucionarlo?

    Gracias por sus aportes
    jueves, 3 de septiembre de 2020 1:50

Respuestas

  • Hola William Patiño:

    Si observas la imagen de la última captura de pantalla, en la parte debajo de la marca roja para un sql server en inglés dice "average row size". Por tanto es una mala traducción.

    Desconozco exactamente que valor quiere expresar, y no encuentro en la documentación ningún sitio donde lo cuente.

    Pero es muy fácil de forzar.

    create table dbo.filas (id int identity (1,1)primary key,
    col nvarchar(max))
    Go
    ;WITH C1 AS (
    	  SELECT T.N	FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))T(N)
    	), C2 AS ( SELECT C1.N FROM C1 CROSS JOIN C1 AS B)
    	 , C3 AS ( SELECT C2.N FROM C2 CROSS JOIN C2 AS B)
    Insert into dbo.filas
    (col)
    Select REPLICATE(N' ',8000)
    FROM C3;
    go

    Genero 10.000 con una columna de identidad y una columna que ocupa 8000 caracteres.

    Sin embargo con la misma estructura, pero diferentes datos.

    create table dbo.filas2 (id int identity (1,1)primary key,
    col nvarchar(max))
    Go
    ;WITH C1 AS (
    	  SELECT T.N	FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))T(N)
    	), C2 AS ( SELECT C1.N FROM C1 CROSS JOIN C1 AS B)
    	 , C3 AS ( SELECT C2.N FROM C2 CROSS JOIN C2 AS B)
    Insert into dbo.filas2
    (col)
    Select N'a'
    FROM C3;
    go

    Por tanto ese no es un indicador válido para mirar las filas que tiene una tabla.

    • Marcado como respuesta William Patiño martes, 15 de septiembre de 2020 15:49
    viernes, 4 de septiembre de 2020 15:51

Todas las respuestas

  • Hola William Patiño:

    Puedes probar a realizar un 

    exec sp_updatestats
    Para actualizar todas las estadísticas de la base.
    jueves, 3 de septiembre de 2020 3:35
  • Buen día Javi Fernández.  Muchas gracias por tu aporte, te cuento:

    1. Cada semana (Domingos) tengo un job que reconstruye o reordena los PK e índices no adjuntos dependiendo de su %Fragmentación, adicionalmente actualiza las estadísticas de cada tabla

    2. Siguiendo tu recomendación ejecuté las estadísticas en la BD y el resultado de la tabla que comenté es:

    - Por propiedades de la tabla: 535.336 filas
    - Por propiedades de la llave primaria: 532.800 filas

    - Por propiedades de tres (3) índices no adjuntos adicionales, muestra las mismas 535.336  filas de la tabla

    Agradezco si me ayudan con mas sugerencias.

    HAy alguna circunstancia en que la cantidad de filas de la PK sea diferente a la cantidad de filas de la tabla?, pienso que siempre deben ser iguales.

    Gracias por su ayuda

      
    jueves, 3 de septiembre de 2020 17:50
  • Hola William Patiño:

    ¿Cómo ves las propiedades del índice? 

    Desde el management studio,

    o mediante alguna query.

    jueves, 3 de septiembre de 2020 18:09
  • Si señor, por las propiedades del índice y en la sección de fragmentación tal como lo muestras ahí.

    Para los índices no adjuntos me muestra el mismo número de filas que me muestra la tabla, pero para la PK me muestra un número diferente y cada vez que uso la opción "Reconstruir" me muestra diferentes números.  Al actualizar estadísticas ese número cambia pero siempre es diferente al número real de filas.

    En otras BD que tengo, las tablas que he consultado muestran el mismo número de filas tanto por PK como por las propiedades de tabla
    viernes, 4 de septiembre de 2020 2:13
  • Hola William Patiño:

    No es anormal, como puedes ver es fácilmente reproducible. Ese valor de Filas no corresponde al número de registros

    Yo he cogido una tabla que es un poco especial, por contenido y tamaño de campos, y he cambiado el factor de relleno, y he multiplicado por 6 los datos que tenía.

    En la edición en inglés, ese literal ofrece otra información.

    El recuadro en rojo, no tiene nada que ver. Esta extraído de un artículo sobre el tema de la información de Management Studio.

    https://www.mssqltips.com/sqlservertip/3096/sql-server-index-properties-in-management-studio/

    viernes, 4 de septiembre de 2020 5:15
  • Buen día de nuevo Javi Fernández.  Gracias por el tiempo que has dedicado a mi consulta.

    Me sigue causando duda el tema ya que tengo otras BD en las que para todas las tablas la cantidad de registros coincide con lo mostrado por su PK.  Por ejemplo:


    Siempre uso la información del índice para analizar el almacenamiento y optimizar, sin embargo en la BD donde se presenta la diferencia solo algunas tablas no coinciden en esa cantidad de registros (y no hay filas fantasma).  Mira:

    La cuestión es que al reordenar o reconstruir o actualizar estadísticas (cada vez que se hace) el número de registros cambia por otro valor diferente que no concuerda.  Por ejemplo, hice una reconstrucción del índice y mira el resultado, otra cantidad de registros completamente diferente.

    En otras BD que tengo incluso mas grandes que esta, la cantidad de registros mostrada por las propiedades de la tabla (SSMS) o por el comando sp_spaceused vs la cantidad de filas mostrada en las propiedades del índice SIEMPRE es la misma.

    Si esta situación es normal, eso quiere decir que la info mostrada por las propiedades del índice no es confiable y no sirve para hacer administración.  ¿Qué opinas?

    viernes, 4 de septiembre de 2020 13:08
  • Hola William Patiño:

    Si observas la imagen de la última captura de pantalla, en la parte debajo de la marca roja para un sql server en inglés dice "average row size". Por tanto es una mala traducción.

    Desconozco exactamente que valor quiere expresar, y no encuentro en la documentación ningún sitio donde lo cuente.

    Pero es muy fácil de forzar.

    create table dbo.filas (id int identity (1,1)primary key,
    col nvarchar(max))
    Go
    ;WITH C1 AS (
    	  SELECT T.N	FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))T(N)
    	), C2 AS ( SELECT C1.N FROM C1 CROSS JOIN C1 AS B)
    	 , C3 AS ( SELECT C2.N FROM C2 CROSS JOIN C2 AS B)
    Insert into dbo.filas
    (col)
    Select REPLICATE(N' ',8000)
    FROM C3;
    go

    Genero 10.000 con una columna de identidad y una columna que ocupa 8000 caracteres.

    Sin embargo con la misma estructura, pero diferentes datos.

    create table dbo.filas2 (id int identity (1,1)primary key,
    col nvarchar(max))
    Go
    ;WITH C1 AS (
    	  SELECT T.N	FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))T(N)
    	), C2 AS ( SELECT C1.N FROM C1 CROSS JOIN C1 AS B)
    	 , C3 AS ( SELECT C2.N FROM C2 CROSS JOIN C2 AS B)
    Insert into dbo.filas2
    (col)
    Select N'a'
    FROM C3;
    go

    Por tanto ese no es un indicador válido para mirar las filas que tiene una tabla.

    • Marcado como respuesta William Patiño martes, 15 de septiembre de 2020 15:49
    viernes, 4 de septiembre de 2020 15:51
  • Te agradezco mucho ese ejemplo y el tiempo que has dedicado a mi consulta. 

    Tomaré tu respuesta como la final en este caso, dejando nota que eso me está sucediendo en SQL Server 2014.  He revisado otras BD en 2017 y la información si es consistente.

    Cordial saludo,

    WILLIAM P

    martes, 15 de septiembre de 2020 15:51