Consulta va lenta.

20/10/2003 - 09:53 por Antonio Liberal | Informe spam
Hola buenas, tengo una tabla con cerca de 3 millones de registros, donde
guardo los movimientos de stock de una aplicación, guardada en un SQL-Server
2000

La sentencia es la siguiente:
SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>(CONVERT(DATETIME, '2003/09/30', 102) + 1)

(Se obtienen unos 40.000 registros)

Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución me da que
utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos, como si se
recorriera toda la tabla. Estoy en un entorno de pruebas y el único usuario
soy yo.

¿Como puedo optimizar la consulta para que me funcione más rápido?

Gracias.

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
20/10/2003 - 16:38 | Informe spam
Antonio,
¿Podrías mandar la definición de tu tabla?
¿En el ejemplo estás buscando a partir del 01/10/2003 y esa fecha entra por
parámetro?

Saludos... Liliana.


"Antonio Liberal" escribió en
el mensaje news:
Hola buenas, tengo una tabla con cerca de 3 millones de registros, donde
guardo los movimientos de stock de una aplicación, guardada en un


SQL-Server
2000

La sentencia es la siguiente:
SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>> (CONVERT(DATETIME, '2003/09/30', 102) + 1)

(Se obtienen unos 40.000 registros)

Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución me da


que
utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos, como si se
recorriera toda la tabla. Estoy en un entorno de pruebas y el único


usuario
soy yo.

¿Como puedo optimizar la consulta para que me funcione más rápido?

Gracias.


Respuesta Responder a este mensaje
#2 Gustavo Larriera [MVP]
20/10/2003 - 18:29 | Informe spam
Antonio: Tambien sugiero que nos envies el plan de ejecución generado en
modo texto.

SET SHOWPLAN_TEXT ON
GO
USE NombreDeLaBaseDeDatos
SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
INTO #MOV0 FROM MOVALMACEN
WHERE EMPRESA= '01' AND FECHA>=(CONVERT(DATETIME, '2003/09/30', 102) + 1)
GO


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Liliana Sorrentino" wrote in message
news:
Antonio,
¿Podrías mandar la definición de tu tabla?
¿En el ejemplo estás buscando a partir del 01/10/2003 y esa fecha entra


por
parámetro?

Saludos... Liliana.


"Antonio Liberal" escribió


en
el mensaje news:
> Hola buenas, tengo una tabla con cerca de 3 millones de registros, donde
> guardo los movimientos de stock de una aplicación, guardada en un
SQL-Server
> 2000
>
> La sentencia es la siguiente:
> SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>> > (CONVERT(DATETIME, '2003/09/30', 102) + 1)
>
> (Se obtienen unos 40.000 registros)
>
> Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución me da
que
> utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos, como si


se
> recorriera toda la tabla. Estoy en un entorno de pruebas y el único
usuario
> soy yo.
>
> ¿Como puedo optimizar la consulta para que me funcione más rápido?
>
> Gracias.
>
>


Respuesta Responder a este mensaje
#3 Antonio Liberal
21/10/2003 - 08:30 | Informe spam
Hola Gustavo, gracias por responder (a Liliana también). Dejé un post ayer,
pero no sale en el hilo
Con lo siguiente he conseguido mejorar notablemente la velocidad:
1. Volqué todos los datos de la tabla a una auxiliar.
2. Desactivé los disparadores de la tabla principal.
3. Borré los datos de dicha tabla.
4. Volqué los datos de la auxiliar a la principal.
5. Activé los disparadores.

A partír de aquí la consulta va mucho más rápida. Había observado que al
hacer la consulta el servidor le daba mucha "caña" a los discos. Es algo así
como si los datos estuvieran fragmentados. ¿Existe alguna forma de conocer
cómo están repartidos los datos por el disco? ¿Se pueden "defragmentar" de
alguna manera que no sea la que he hecho?

Gracias.

"Gustavo Larriera [MVP]" escribió en el
mensaje news:
Antonio: Tambien sugiero que nos envies el plan de ejecución generado en
modo texto.

SET SHOWPLAN_TEXT ON
GO
USE NombreDeLaBaseDeDatos
SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
INTO #MOV0 FROM MOVALMACEN
WHERE EMPRESA= '01' AND FECHA>=(CONVERT(DATETIME, '2003/09/30', 102) + 1)
GO


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Liliana Sorrentino" wrote in message
news:
> Antonio,
> ¿Podrías mandar la definición de tu tabla?
> ¿En el ejemplo estás buscando a partir del 01/10/2003 y esa fecha entra
por
> parámetro?
>
> Saludos... Liliana.
>
>
> "Antonio Liberal"


escribió
en
> el mensaje news:
> > Hola buenas, tengo una tabla con cerca de 3 millones de registros,


donde
> > guardo los movimientos de stock de una aplicación, guardada en un
> SQL-Server
> > 2000
> >
> > La sentencia es la siguiente:
> > SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> > INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>> > > (CONVERT(DATETIME, '2003/09/30', 102) + 1)
> >
> > (Se obtienen unos 40.000 registros)
> >
> > Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución me


da
> que
> > utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos, como si
se
> > recorriera toda la tabla. Estoy en un entorno de pruebas y el único
> usuario
> > soy yo.
> >
> > ¿Como puedo optimizar la consulta para que me funcione más rápido?
> >
> > Gracias.
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Carlos Sacristan
21/10/2003 - 08:44 | Informe spam
Echa un vistazo a lo que te presenta el resultado de la instrucción DBCC
SHOWCONTIG ("Presenta información de la fragmentación de los datos y los
índices de la tabla especificada.", textual de los BOL)



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)
MVP SQL Server
Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL

Archivo de respuestas anteriores en:
http://groups.google.com/groups?hl=....public.es
.sqlserver

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Antonio Liberal" escribió en
el mensaje news:#
Hola Gustavo, gracias por responder (a Liliana también). Dejé un post


ayer,
pero no sale en el hilo
Con lo siguiente he conseguido mejorar notablemente la velocidad:
1. Volqué todos los datos de la tabla a una auxiliar.
2. Desactivé los disparadores de la tabla principal.
3. Borré los datos de dicha tabla.
4. Volqué los datos de la auxiliar a la principal.
5. Activé los disparadores.

A partír de aquí la consulta va mucho más rápida. Había observado que al
hacer la consulta el servidor le daba mucha "caña" a los discos. Es algo


así
como si los datos estuvieran fragmentados. ¿Existe alguna forma de conocer
cómo están repartidos los datos por el disco? ¿Se pueden "defragmentar" de
alguna manera que no sea la que he hecho?

Gracias.

"Gustavo Larriera [MVP]" escribió en


el
mensaje news:
> Antonio: Tambien sugiero que nos envies el plan de ejecución generado en
> modo texto.
>
> SET SHOWPLAN_TEXT ON
> GO
> USE NombreDeLaBaseDeDatos
> SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> INTO #MOV0 FROM MOVALMACEN
> WHERE EMPRESA= '01' AND FECHA>=(CONVERT(DATETIME, '2003/09/30', 102) +


1)
> GO
>
>
> Gustavo Larriera, MSFT MVP-SQL
> Uruguay LatAm
>
> This message is provided "AS IS" with no warranties expressed or


implied,
> and confers no rights.
>
>
> "Liliana Sorrentino" wrote in message
> news:
> > Antonio,
> > ¿Podrías mandar la definición de tu tabla?
> > ¿En el ejemplo estás buscando a partir del 01/10/2003 y esa fecha


entra
> por
> > parámetro?
> >
> > Saludos... Liliana.
> >
> >
> > "Antonio Liberal"
escribió
> en
> > el mensaje news:
> > > Hola buenas, tengo una tabla con cerca de 3 millones de registros,
donde
> > > guardo los movimientos de stock de una aplicación, guardada en un
> > SQL-Server
> > > 2000
> > >
> > > La sentencia es la siguiente:
> > > SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> > > INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>> > > > (CONVERT(DATETIME, '2003/09/30', 102) + 1)
> > >
> > > (Se obtienen unos 40.000 registros)
> > >
> > > Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución


me
da
> > que
> > > utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos, como


si
> se
> > > recorriera toda la tabla. Estoy en un entorno de pruebas y el único
> > usuario
> > > soy yo.
> > >
> > > ¿Como puedo optimizar la consulta para que me funcione más rápido?
> > >
> > > Gracias.
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#5 Antonio Liberal
21/10/2003 - 09:19 | Informe spam
Hola Carlos, gracias por responder. Me parece que va a ser esto. He
recuperado la tabla principal y me da los siguientes resultados (te los
pongo al final del post).
Una cosa, ya he visto que los indices se pueden defragmentar con DBCC
INDEXDEFRAG ó regenerándolos de nuevo. Tengo un plan de mantenimiento para
hacer la copia de seguridad de la base de datos. Con la opción Reorganizar
páginas de datos e índices en la solapa de Optimizaciones, me valdría, ¿no?

Saludos.


DBCC SHOWCONTIG recorriendo la tabla 'MOVALMACEN'...
Tabla: 'MOVALMACEN' (544213189); Id. de índice: 1, Id. de base de datos: 7
Realizado recorrido de nivel TABLE.
- Páginas recorridas: 59415
- Extensiones recorridas..: 7466
- Cambios de extensión..: 59300
- Promedio de páginas por extensión: 8.0
- Densidad de recorrido [Cuenta óptima:Cuenta real]...: 12.52%
[7427:59301]
- Fragmentación del recorrido lógico ..: 49.85%
- Fragmentación del recorrido de extensión ...: 63.35%
- Promedio de bytes libres por página.: 2510.7
- Promedio de densidad de página (completa).: 68.98%
DBCC SHOWCONTIG recorriendo la tabla 'MOVALMACEN'...
Tabla: 'MOVALMACEN' (544213189); Id. de índice: 11, Id. de base de datos: 7
Realizado recorrido de nivel LEAF.
- Páginas recorridas: 19716
- Extensiones recorridas..: 2491
- Cambios de extensión..: 15496
- Promedio de páginas por extensión: 7.9
- Densidad de recorrido [Cuenta óptima:Cuenta real]...: 15.91%
[2465:15497]
- Fragmentación del recorrido lógico ..: 42.54%
- Fragmentación del recorrido de extensión ...: 63.99%
- Promedio de bytes libres por página.: 2334.7
- Promedio de densidad de página (completa).: 71.16%
DBCC SHOWCONTIG recorriendo la tabla 'MOVALMACEN'...
Tabla: 'MOVALMACEN' (544213189); Id. de índice: 12, Id. de base de datos: 7
Realizado recorrido de nivel LEAF.
- Páginas recorridas: 15065
- Extensiones recorridas..: 1902
- Cambios de extensión..: 8785
- Promedio de páginas por extensión: 7.9
- Densidad de recorrido [Cuenta óptima:Cuenta real]...: 21.44%
[1884:8786]
- Fragmentación del recorrido lógico ..: 25.93%
- Fragmentación del recorrido de extensión ...: 55.89%
- Promedio de bytes libres por página.: 1473.5
- Promedio de densidad de página (completa).: 81.80%
Ejecución de DBCC completada. Si hay mensajes de error, consulte al
administrador del sistema.

"Carlos Sacristan" escribió en el mensaje
news:%

Echa un vistazo a lo que te presenta el resultado de la instrucción


DBCC
SHOWCONTIG ("Presenta información de la fragmentación de los datos y los
índices de la tabla especificada.", textual de los BOL)



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)
MVP SQL Server
Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL

Archivo de respuestas anteriores en:



http://groups.google.com/groups?hl=....public.es
.sqlserver

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Antonio Liberal" escribió


en
el mensaje news:#
> Hola Gustavo, gracias por responder (a Liliana también). Dejé un post
ayer,
> pero no sale en el hilo
> Con lo siguiente he conseguido mejorar notablemente la velocidad:
> 1. Volqué todos los datos de la tabla a una auxiliar.
> 2. Desactivé los disparadores de la tabla principal.
> 3. Borré los datos de dicha tabla.
> 4. Volqué los datos de la auxiliar a la principal.
> 5. Activé los disparadores.
>
> A partír de aquí la consulta va mucho más rápida. Había observado que al
> hacer la consulta el servidor le daba mucha "caña" a los discos. Es algo
así
> como si los datos estuvieran fragmentados. ¿Existe alguna forma de


conocer
> cómo están repartidos los datos por el disco? ¿Se pueden "defragmentar"


de
> alguna manera que no sea la que he hecho?
>
> Gracias.
>
> "Gustavo Larriera [MVP]" escribió en
el
> mensaje news:
> > Antonio: Tambien sugiero que nos envies el plan de ejecución generado


en
> > modo texto.
> >
> > SET SHOWPLAN_TEXT ON
> > GO
> > USE NombreDeLaBaseDeDatos
> > SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> > INTO #MOV0 FROM MOVALMACEN
> > WHERE EMPRESA= '01' AND FECHA>=(CONVERT(DATETIME, '2003/09/30', 102) +
1)
> > GO
> >
> >
> > Gustavo Larriera, MSFT MVP-SQL
> > Uruguay LatAm
> >
> > This message is provided "AS IS" with no warranties expressed or
implied,
> > and confers no rights.
> >
> >
> > "Liliana Sorrentino" wrote in message
> > news:
> > > Antonio,
> > > ¿Podrías mandar la definición de tu tabla?
> > > ¿En el ejemplo estás buscando a partir del 01/10/2003 y esa fecha
entra
> > por
> > > parámetro?
> > >
> > > Saludos... Liliana.
> > >
> > >
> > > "Antonio Liberal"
> escribió
> > en
> > > el mensaje news:
> > > > Hola buenas, tengo una tabla con cerca de 3 millones de registros,
> donde
> > > > guardo los movimientos de stock de una aplicación, guardada en un
> > > SQL-Server
> > > > 2000
> > > >
> > > > La sentencia es la siguiente:
> > > > SELECT EMPRESA, CODART, TIPORI, TIPDES, CANTID
> > > > INTO #MOV0 FROM MOVALMACEN WHERE EMPRESA= '01' AND FECHA>> > > > > (CONVERT(DATETIME, '2003/09/30', 102) + 1)
> > > >
> > > > (Se obtienen unos 40.000 registros)
> > > >
> > > > Tengo un índice por EMPRESA,FECHA. Si ejecuto el plan de ejecución
me
> da
> > > que
> > > > utiliza dicho índice. Sin embargo me tarda cerca de 2 minutos,


como
si
> > se
> > > > recorriera toda la tabla. Estoy en un entorno de pruebas y el


único
> > > usuario
> > > > soy yo.
> > > >
> > > > ¿Como puedo optimizar la consulta para que me funcione más rápido?
> > > >
> > > > Gracias.
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida