dbcc dbreindex

10/01/2006 - 13:40 por Santiago | Informe spam
Buenos días,

Llevo una semana que el rendimiento de sql server se ha reducido. He estado
dos meses intensos añadiendo y actualizando datos y por tanto es lógico que
los índices haya que actualizarlos.

Primero hago un DBCC SHOWCONTIG(id de la tabla object) sobre una tabla y veo
que existe casi un 50% de fragmentación (scan desity), por lo que ejecuto
una actualización del índice con la sentencia DBCC DBREINDEX(USR,'',0) para
que reorganice todos los índices de dicha tabla. SQL Server me dice que ha
finalizado correctamente, pero cuando vuelvo a hacer DBCC SHOWCONTIG veo los
mismos resultados, osea que no reduce la desfragmentación del scandensity.
¿Qué estoy haciendo mal?

Gracias por todo

Un Saludo

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
12/01/2006 - 15:57 | Informe spam
Santiago,

Yo no dije que el comando "dbcc dbreindex" no es util sobre indices
clustered. Creo que no me explique bien. Si te fijas en la informacion que
posteastes sobre "dbcc showcontig":

****************
Como me va muy lenta la base de datos, ejecuto el comando DBCC
SHOWCONTIG(enrollment) sobre esta tabla y obtengo este resultado:

DBCC SHOWCONTIG recorriendo la tabla 'ENROLLMENT'...
Tabla: 'ENROLLMENT' (2133582639); Id. de índice: 0, Id. de base de datos: 7
Realizado recorrido de nivel TABLE.
- Páginas recorridas: 69
- Extensiones recorridas..: 16
- Cambios de extensión..: 15
- Promedio de páginas por extensión: 4.3
- Densidad de recorrido [Cuenta óptima:Cuenta real]...: 56.25% [9:16]
- Fragmentación del recorrido de extensión ...: 87.50%
- Promedio de bytes libres por página.: 842.2
- Promedio de densidad de página (completa).: 89.60%
Ejecución de DBCC completada. Si hay mensajes de error, consulte al
administrador del sistema.
****************

Te daras cuenta que la fragmentacion es en la tabla y no el indice
nonclustered.

Tabla: 'ENROLLMENT' (2133582639); Id. de índice: 0, Id. de base de datos: 7



Id. de índice: 0 > significa la tabla (heap - tabla sin indice
clustered)

Te paso un articulo para que te puedas familiarizar mas con el tema de
fragmentacion.

Microsoft SQL Server 2000 Index Defragmentation Best Practices
http://www.microsoft.com/technet/pr...kidbp.mspx


AMB

"Santiago" wrote:

Alejadro,

Ante todo, gracias por contestar.

Por tu mensaje, entiendo que si un índice es no agrupado (non-clustered)
significa que la sentencia dbcc dbreindex no sirve, ya que sólo sirve para
índices agrupados (clustered). Si es así (por favor confírmamelo), ahora
entiendo por qué no funciona el comando sobre los índices, entonces: ¿Cómo
puedo reindexar los índices no agrupados (non-clustered)? ¿Es lo mismo
truncar la tabla que copiar la base de datos y restaurarla? ¿No hay otra
manera más sencilla?

Respecto a la creación de un índice agrupado, no puedo hacerlo, ya que la
creación de la base de datos pertenece a un producto de IBM y puede que al
hacerlo no funcione bien la aplicación.

Un Saludo

Gracias


"Alejandro Mesa" escribió en el
mensaje news:
> Santiago,
>
> Algo me llama la atencion y es que esa tabla no tiene un indice clustered.
> Te recomiendo que crees uno, es una buena practica que cada tabla tenga un
> indice clustered, pues entre otros efectos (de no tener uno), esta el que
> la
> tabla queda propensa a fragmentacion y esta fragmentacion no puede
> arreglarse
> usando "dbcc dbreindex" o "dbcc index defrag". La unica forma de arreglar
> la
> fragmentacion seria copiando la data a un lugar temporal, truncar la tabla
> y
> volver a cargar la data. Esto lo evitas teniendo un indice clustered. Para
> escojer la(s) columna(s) para la llave, fijate en los queries que ejecutas
> contra esta tabla, especialmente las columnas que participan en filtros de
> rango (c1 between x and y, c1 >= x, c1 <= y, etc.) o en las clausulas
> "group
> by" y/o "order by".
>
> Una vez que hayas seleccionado las columnas candidatas (trata de que sean
> pocas y que sean de poco tamaño), elimina los indices nonclustered,
> elimina
> la restriccion de clave primaria, crea el indice clustered, recrea la
> restriccion de clave primaria y recrea los otros indices nonclustered.
> Corre
> el comando "dbcc showting" nuevamente y dejanos saber.
>
>
> AMB
>
> "Santiago" wrote:
>
>> Pongo parte del script de la creación de esta tabla. Creo que crea la
>> tabla
>> enrollment y varios índices. Luego la modifica y añade algo más.
>> Finalmente
>> crea una vista
>>
>> /*
>> * TABLE: ENROLLMENT
>> */
>>
>> CREATE TABLE ENROLLMENT(
>> OID CHAR(20) NOT NULL,
>> CATALOGENTRY_OID CHAR(20) NOT NULL,
>> OFFERING_OID CHAR(20) NULL,
>> USER_OID CHAR(20) NOT NULL,
>> ENROLLDATE DATETIME NULL,
>> COMPLETED_ON DATETIME NULL,
>> STATE INT NULL
>> CONSTRAINT CHK_ENROLL_S CHECK (STATE IN
>> (0,1,2,3,10,90,100,101,110,111)),
>> ONLINESTATE INT NULL
>> CONSTRAINT CHK_ENROLL_OLS CHECK (ONLINESTATE
>> BETWEEN
>> 0 AND 2),
>> IS_FOR_CREDIT BIT DEFAULT 1 NOT NULL,
>> SOURCE INT NULL
>> CHECK (SOURCE IN (0,1,2,10)),
>> CONSTRAINT ENROLLMENT_PK PRIMARY KEY NONCLUSTERED (OID)
>> )
>> GO
>>
>>
>> IF OBJECT_ID('ENROLLMENT') IS NOT NULL
>> PRINT '<<< CREATED TABLE ENROLLMENT >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING TABLE ENROLLMENT >>>'
>> GO
>>
>>
>> /*
>> * INDEX: ENROLL_USER_I
>> */
>>
>> CREATE INDEX ENROLL_USER_I ON ENROLLMENT(USER_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT') AND
>> NAME='ENROLL_USER_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_USER_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_USER_I >>>'
>> GO
>>
>> /*
>> * INDEX: ENROLL_OFFER_I
>> */
>>
>> CREATE INDEX ENROLL_OFFER_I ON ENROLLMENT(OFFERING_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT') AND
>> NAME='ENROLL_OFFER_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_OFFER_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_OFFER_I >>>'
>> GO
>>
>> /*
>> * INDEX: ENROLL_CEOID_I
>> */
>>
>> CREATE INDEX ENROLL_CEOID_I ON ENROLLMENT(CATALOGENTRY_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT') AND
>> NAME='ENROLL_CEOID_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_CEOID_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_CEOID_I >>>'
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_CE_E
>> FOREIGN KEY (CATALOGENTRY_OID)
>> REFERENCES CATALOGENTRY(OID)
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_OFF_ENROLL
>> FOREIGN KEY (OFFERING_OID)
>> REFERENCES OFFERING(OID)
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_USR_ENROLL
>> FOREIGN KEY (USER_OID)
>> REFERENCES USR(OID)
>> GO
>>
>> CREATE VIEW ENROLLABLE (
>> OID,ENROLLABLE_OID,USER_OID,MASTER_OID,METADATA_TREE_OID,OBJECTIVE_OID )
>> AS SELECT
>> A.OID,ISNULL(A.OFFERING_OID,A.CATALOGENTRY_OID)
>> ENROLLABLE_OID,A.USER_OID,B.MASTER_OID,C.METADATA_TREE_OID,D.OID
>> FROM ENROLLMENT A,CATALOGENTRY B,MASTER C LEFT OUTER JOIN OBJECTIVE D ON
>> C.METADATA_TREE_OID = D.METADATA_TREE_OID
>> WHERE
>> A.CATALOGENTRY_OID = B.OID AND
>> B.MASTER_OID = C.OID
>> GO
>>
>> Un saludo
>>
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > Santiago,
>> >
>> > Por que no nos haces un favor y posteas la estructura de la tabla,
>> > incluyendo indices, cantidad de filas y el resultado del comand "dbcc
>> > showcontig"?
>> >
>> > Es cierto que el "scan density" debe estar lo mas cerca posible a 100%,
>> > de
>> > lo contrario indicaria que tienes fragmentacion externa.
>> >
>> >
>> > AMB
>> >
>> > "Santiago" wrote:
>> >
>> >> Buenos días,
>> >>
>> >> Llevo una semana que el rendimiento de sql server se ha reducido. He
>> >> estado
>> >> dos meses intensos añadiendo y actualizando datos y por tanto es
>> >> lógico
>> >> que
>> >> los índices haya que actualizarlos.
>> >>
>> >> Primero hago un DBCC SHOWCONTIG(id de la tabla object) sobre una tabla
>> >> y
>> >> veo
>> >> que existe casi un 50% de fragmentación (scan desity), por lo que
>> >> ejecuto
>> >> una actualización del índice con la sentencia DBCC DBREINDEX(USR,'',0)
>> >> para
>> >> que reorganice todos los índices de dicha tabla. SQL Server me dice
>> >> que
>> >> ha
>> >> finalizado correctamente, pero cuando vuelvo a hacer DBCC SHOWCONTIG
>> >> veo
>> >> los
>> >> mismos resultados, osea que no reduce la desfragmentación del
>> >> scandensity.
>> >> ¿Qué estoy haciendo mal?
>> >>
>> >> Gracias por todo
>> >>
>> >> Un Saludo
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#7 Santiago
13/01/2006 - 10:33 | Informe spam
Alejandro,

He estado viendo el artículo que comentas y veo que hace referencia a
desfragmentación sobre índices de sqlserver y por lo que comentas la
fragmentación ocurre en la tabla no en los índices. He probado a reorganizar
el disco duro utilizando defrag de Windows Server 2003, pero el comando dbcc
showcontig sigue mostrando la misma fragmentación en la tabla (lógico puesto
que defrag es a nivel de archivo y la fragmentación es a nivel de tabla).
Entonces: ¿Cómo puedo desfragmentar a nivel lógico las tablas? Si hago una
copia de seguridad y la vuelvo a restaurar ¿Desfragmentará las tablas a
nivel lógico?

Gracias

Un Saludo


"Alejandro Mesa" escribió en el
mensaje news:
Santiago,

Yo no dije que el comando "dbcc dbreindex" no es util sobre indices
clustered. Creo que no me explique bien. Si te fijas en la informacion que
posteastes sobre "dbcc showcontig":

****************
Como me va muy lenta la base de datos, ejecuto el comando DBCC
SHOWCONTIG(enrollment) sobre esta tabla y obtengo este resultado:

DBCC SHOWCONTIG recorriendo la tabla 'ENROLLMENT'...
Tabla: 'ENROLLMENT' (2133582639); Id. de índice: 0, Id. de base de datos:
7
Realizado recorrido de nivel TABLE.
- Páginas recorridas: 69
- Extensiones recorridas..: 16
- Cambios de extensión..: 15
- Promedio de páginas por extensión: 4.3
- Densidad de recorrido [Cuenta óptima:Cuenta real]...: 56.25% [9:16]
- Fragmentación del recorrido de extensión ...: 87.50%
- Promedio de bytes libres por página.: 842.2
- Promedio de densidad de página (completa).: 89.60%
Ejecución de DBCC completada. Si hay mensajes de error, consulte al
administrador del sistema.
****************

Te daras cuenta que la fragmentacion es en la tabla y no el indice
nonclustered.

Tabla: 'ENROLLMENT' (2133582639); Id. de índice: 0, Id. de base de datos:
7



Id. de índice: 0 > significa la tabla (heap - tabla sin indice
clustered)

Te paso un articulo para que te puedas familiarizar mas con el tema de
fragmentacion.

Microsoft SQL Server 2000 Index Defragmentation Best Practices
http://www.microsoft.com/technet/pr...kidbp.mspx


AMB

"Santiago" wrote:

Alejadro,

Ante todo, gracias por contestar.

Por tu mensaje, entiendo que si un índice es no agrupado (non-clustered)
significa que la sentencia dbcc dbreindex no sirve, ya que sólo sirve
para
índices agrupados (clustered). Si es así (por favor confírmamelo), ahora
entiendo por qué no funciona el comando sobre los índices, entonces:
¿Cómo
puedo reindexar los índices no agrupados (non-clustered)? ¿Es lo mismo
truncar la tabla que copiar la base de datos y restaurarla? ¿No hay otra
manera más sencilla?

Respecto a la creación de un índice agrupado, no puedo hacerlo, ya que la
creación de la base de datos pertenece a un producto de IBM y puede que
al
hacerlo no funcione bien la aplicación.

Un Saludo

Gracias


"Alejandro Mesa" escribió en el
mensaje news:
> Santiago,
>
> Algo me llama la atencion y es que esa tabla no tiene un indice
> clustered.
> Te recomiendo que crees uno, es una buena practica que cada tabla tenga
> un
> indice clustered, pues entre otros efectos (de no tener uno), esta el
> que
> la
> tabla queda propensa a fragmentacion y esta fragmentacion no puede
> arreglarse
> usando "dbcc dbreindex" o "dbcc index defrag". La unica forma de
> arreglar
> la
> fragmentacion seria copiando la data a un lugar temporal, truncar la
> tabla
> y
> volver a cargar la data. Esto lo evitas teniendo un indice clustered.
> Para
> escojer la(s) columna(s) para la llave, fijate en los queries que
> ejecutas
> contra esta tabla, especialmente las columnas que participan en filtros
> de
> rango (c1 between x and y, c1 >= x, c1 <= y, etc.) o en las clausulas
> "group
> by" y/o "order by".
>
> Una vez que hayas seleccionado las columnas candidatas (trata de que
> sean
> pocas y que sean de poco tamaño), elimina los indices nonclustered,
> elimina
> la restriccion de clave primaria, crea el indice clustered, recrea la
> restriccion de clave primaria y recrea los otros indices nonclustered.
> Corre
> el comando "dbcc showting" nuevamente y dejanos saber.
>
>
> AMB
>
> "Santiago" wrote:
>
>> Pongo parte del script de la creación de esta tabla. Creo que crea la
>> tabla
>> enrollment y varios índices. Luego la modifica y añade algo más.
>> Finalmente
>> crea una vista
>>
>> /*
>> * TABLE: ENROLLMENT
>> */
>>
>> CREATE TABLE ENROLLMENT(
>> OID CHAR(20) NOT NULL,
>> CATALOGENTRY_OID CHAR(20) NOT NULL,
>> OFFERING_OID CHAR(20) NULL,
>> USER_OID CHAR(20) NOT NULL,
>> ENROLLDATE DATETIME NULL,
>> COMPLETED_ON DATETIME NULL,
>> STATE INT NULL
>> CONSTRAINT CHK_ENROLL_S CHECK (STATE IN
>> (0,1,2,3,10,90,100,101,110,111)),
>> ONLINESTATE INT NULL
>> CONSTRAINT CHK_ENROLL_OLS CHECK (ONLINESTATE
>> BETWEEN
>> 0 AND 2),
>> IS_FOR_CREDIT BIT DEFAULT 1 NOT NULL,
>> SOURCE INT NULL
>> CHECK (SOURCE IN (0,1,2,10)),
>> CONSTRAINT ENROLLMENT_PK PRIMARY KEY NONCLUSTERED (OID)
>> )
>> GO
>>
>>
>> IF OBJECT_ID('ENROLLMENT') IS NOT NULL
>> PRINT '<<< CREATED TABLE ENROLLMENT >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING TABLE ENROLLMENT >>>'
>> GO
>>
>>
>> /*
>> * INDEX: ENROLL_USER_I
>> */
>>
>> CREATE INDEX ENROLL_USER_I ON ENROLLMENT(USER_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT')
>> AND
>> NAME='ENROLL_USER_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_USER_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_USER_I >>>'
>> GO
>>
>> /*
>> * INDEX: ENROLL_OFFER_I
>> */
>>
>> CREATE INDEX ENROLL_OFFER_I ON ENROLLMENT(OFFERING_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT')
>> AND
>> NAME='ENROLL_OFFER_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_OFFER_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_OFFER_I >>>'
>> GO
>>
>> /*
>> * INDEX: ENROLL_CEOID_I
>> */
>>
>> CREATE INDEX ENROLL_CEOID_I ON ENROLLMENT(CATALOGENTRY_OID)
>> GO
>> IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('ENROLLMENT')
>> AND
>> NAME='ENROLL_CEOID_I')
>> PRINT '<<< CREATED INDEX ENROLLMENT.ENROLL_CEOID_I >>>'
>> ELSE
>> PRINT '<<< FAILED CREATING INDEX ENROLLMENT.ENROLL_CEOID_I >>>'
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_CE_E
>> FOREIGN KEY (CATALOGENTRY_OID)
>> REFERENCES CATALOGENTRY(OID)
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_OFF_ENROLL
>> FOREIGN KEY (OFFERING_OID)
>> REFERENCES OFFERING(OID)
>> GO
>>
>> ALTER TABLE ENROLLMENT ADD CONSTRAINT REF_USR_ENROLL
>> FOREIGN KEY (USER_OID)
>> REFERENCES USR(OID)
>> GO
>>
>> CREATE VIEW ENROLLABLE (
>> OID,ENROLLABLE_OID,USER_OID,MASTER_OID,METADATA_TREE_OID,OBJECTIVE_OID
>> )
>> AS SELECT
>> A.OID,ISNULL(A.OFFERING_OID,A.CATALOGENTRY_OID)
>> ENROLLABLE_OID,A.USER_OID,B.MASTER_OID,C.METADATA_TREE_OID,D.OID
>> FROM ENROLLMENT A,CATALOGENTRY B,MASTER C LEFT OUTER JOIN OBJECTIVE D
>> ON
>> C.METADATA_TREE_OID = D.METADATA_TREE_OID
>> WHERE
>> A.CATALOGENTRY_OID = B.OID AND
>> B.MASTER_OID = C.OID
>> GO
>>
>> Un saludo
>>
>>
>> "Alejandro Mesa" escribió en
>> el
>> mensaje news:
>> > Santiago,
>> >
>> > Por que no nos haces un favor y posteas la estructura de la tabla,
>> > incluyendo indices, cantidad de filas y el resultado del comand
>> > "dbcc
>> > showcontig"?
>> >
>> > Es cierto que el "scan density" debe estar lo mas cerca posible a
>> > 100%,
>> > de
>> > lo contrario indicaria que tienes fragmentacion externa.
>> >
>> >
>> > AMB
>> >
>> > "Santiago" wrote:
>> >
>> >> Buenos días,
>> >>
>> >> Llevo una semana que el rendimiento de sql server se ha reducido.
>> >> He
>> >> estado
>> >> dos meses intensos añadiendo y actualizando datos y por tanto es
>> >> lógico
>> >> que
>> >> los índices haya que actualizarlos.
>> >>
>> >> Primero hago un DBCC SHOWCONTIG(id de la tabla object) sobre una
>> >> tabla
>> >> y
>> >> veo
>> >> que existe casi un 50% de fragmentación (scan desity), por lo que
>> >> ejecuto
>> >> una actualización del índice con la sentencia DBCC
>> >> DBREINDEX(USR,'',0)
>> >> para
>> >> que reorganice todos los índices de dicha tabla. SQL Server me dice
>> >> que
>> >> ha
>> >> finalizado correctamente, pero cuando vuelvo a hacer DBCC
>> >> SHOWCONTIG
>> >> veo
>> >> los
>> >> mismos resultados, osea que no reduce la desfragmentación del
>> >> scandensity.
>> >> ¿Qué estoy haciendo mal?
>> >>
>> >> Gracias por todo
>> >>
>> >> Un Saludo
>> >>
>> >>
>> >>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida