TIempo de espera

12/01/2006 - 12:01 por mip | Informe spam
Me gustaria saber com opoder optimizar una consulta porque me tarda mucho
devolverla...
Es una tabla donde hay unos 400.000 registros...
Tengo que elegir uno al azar uso order by newid()
me tarda a veces 30 segundos otras veces tiempo de espera agotado...
Lo van a usar unas 30 personas simultaneas
he probado con select top 1 ... order by newid()
ya no se que probar
El plan de ejecucion me da un 92% en SORT , un 8% en el resto...

Pueden ayudarme ¿?

Preguntas similare

Leer las respuestas

#1 Maxi
12/01/2006 - 13:40 | Informe spam
Hola MIP, si nos pasas todo el plan de ejecucion seria bueno


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"mip" escribió en el mensaje
news:
Me gustaria saber com opoder optimizar una consulta porque me tarda mucho
devolverla...
Es una tabla donde hay unos 400.000 registros...
Tengo que elegir uno al azar uso order by newid()
me tarda a veces 30 segundos otras veces tiempo de espera agotado...
Lo van a usar unas 30 personas simultaneas
he probado con select top 1 ... order by newid()
ya no se que probar
El plan de ejecucion me da un 92% en SORT , un 8% en el resto...

Pueden ayudarme ¿?

Respuesta Responder a este mensaje
#2 qwalgrande
12/01/2006 - 22:16 | Informe spam
Hola.

Es normal que tarde tanto, tienes 400000 llamadas a la función newid() (una
por registro), seguida de una ordenación que no está indexada (como es
lógico). Yo intentaría buscar una alternativa más ligera a esta forma de
obtener un registro aleatoriamente.

Como sugerencia, puedes probar lo siguiente:
1. Crea una tabla que tenga los campos de la clave primaria de la tabla
original que tienes con 400.000 registros, pero vacía, y con un campo más
que sea uniqueidentifier, calculado con un newid(). Llamaré CampoAzar a este
campo. Crea un índice para el campo CampoAzar.
2. Realiza un cálculo de las veces al día que es posible que se deba obtener
un registro al azar y multiplícalo por 3 (para no quedarte corto en ningún
caso). Digamos que se usa en 1000 ocasiones al día (cada usuario tendría que
ejecutarlo unas 30 veces), lo cual daría 3.000.
3. En un job que se ejecute digamos cada noche o en horas de baja carga,
vuelca 3.000 registros a tu tabla nueva (sólo los campos que formen parte de
la clave primaria). La forma de obtener estos diez mil registros sería lo
mismo que ahora usas, pero con un top 3000. Como paso previo a la carga, se
debe realizar un truncado de la misma. Este punto será la parte más costosa
del proceso, pero se realizará en horas de baja o nula carga.
4. Prepárate un procedimiento almacenado que te obtenga un registro de la
nueva tabla (select top 1 CampoPK from NuevaTabla order by CampoAzar). El
valor de CampoPK (o de los campos si en tu tabla original la clave primaria
tiene varios campos) te permitirá identificar el registro en la tabla de los
400.000 registros haciendo una búsqueda por la clave primaria. Puedes
hacerlo en la misma consulta o en dos, uniendo ambas tablas con un inner
join, eso ya como tú prefieras.

Así, cada selección no se hará entre 400.000 registros, pero la aleatoriedad
la tienes, en la práctica, garantizada. Preseleccionas 3.000 registros al
azar, cada día vas tirando de ahí. Luego, cada noche renuevas los registros.

Para evitar que durante la carga (el punto 3) se puedan obtener los
registros al azar, puedes incluir en tu procedimiento que si no hay
registros en la tabla nueva (porque la acabas de truncar y aún no has
volcado los nuevos 3.000 registros), se recurra directamente a la tabla
original, aunque tardará más.

Espero que si no te adapta perfectamente a tu caso, te dé alguna idea sobre
cómo resolver tu problema.

Alberto López Grande (qwalgrande)
"mip" escribió en el mensaje
news:
Me gustaria saber com opoder optimizar una consulta porque me tarda mucho
devolverla...
Es una tabla donde hay unos 400.000 registros...
Tengo que elegir uno al azar uso order by newid()
me tarda a veces 30 segundos otras veces tiempo de espera agotado...
Lo van a usar unas 30 personas simultaneas
he probado con select top 1 ... order by newid()
ya no se que probar
El plan de ejecucion me da un 92% en SORT , un 8% en el resto...

Pueden ayudarme ¿?

Respuesta Responder a este mensaje
#3 mip
13/01/2006 - 10:09 | Informe spam
Me parece buena idea , pero tengo que rizarlo mas y elegir uno al azar pero
con unas determinadas condiciones un tedioso WHERE entonces no veo muy bien
seleccionar uno que luego no me cumpla las condiciones en la tabla de los
400.000


"mip" escribió en el mensaje
news:
Me gustaria saber com opoder optimizar una consulta porque me tarda mucho
devolverla...
Es una tabla donde hay unos 400.000 registros...
Tengo que elegir uno al azar uso order by newid()
me tarda a veces 30 segundos otras veces tiempo de espera agotado...
Lo van a usar unas 30 personas simultaneas
he probado con select top 1 ... order by newid()
ya no se que probar
El plan de ejecucion me da un 92% en SORT , un 8% en el resto...

Pueden ayudarme ¿?

Respuesta Responder a este mensaje
#4 qwalgrande
15/01/2006 - 00:33 | Informe spam
Hola.

A lo mejor puedes añadir una columna a tu tabla que sea de tipo
uniqueidentifier. Esta columna puedes indexarla, incluso incluyendo algún
campo más en el índice, de cara a beneficiar las búsquedas. En todo caso, si
tienes ya la columna en la tabla, el rendimiento se verá muy aumentado para
las consultas de este tipo.

Alberto López Grande (qwalgrande)
"mip" escribió en el mensaje
news:%231$
Me parece buena idea , pero tengo que rizarlo mas y elegir uno al azar
pero con unas determinadas condiciones un tedioso WHERE entonces no veo
muy bien seleccionar uno que luego no me cumpla las condiciones en la
tabla de los 400.000


"mip" escribió en el mensaje
news:
Me gustaria saber com opoder optimizar una consulta porque me tarda mucho
devolverla...
Es una tabla donde hay unos 400.000 registros...
Tengo que elegir uno al azar uso order by newid()
me tarda a veces 30 segundos otras veces tiempo de espera agotado...
Lo van a usar unas 30 personas simultaneas
he probado con select top 1 ... order by newid()
ya no se que probar
El plan de ejecucion me da un 92% en SORT , un 8% en el resto...

Pueden ayudarme ¿?





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