Por que demora tanto!!!!!!

03/02/2004 - 09:42 por Gustavo Morales | Informe spam
Select [Ap. Paterno] = P.A_Paterno, [Ap. Materno] = P.A_Materno, [Nombre] LTrim(RTrim(P.Nombre_1)) + ' ' + LTrim(RTrim(P.Nombre_2)), P.CUSSP,
P.DOCIDEN, P.Sexo, P.Fecha_Nac, P.Domicilio, P.Distrito, P.Telefono, P.RUC,
P.EMail, P.Promedio From Persona P With(Index(Ix_Per_Nombre)) Inner Join
Empresa E On P.RUC = E.RUC Where P.A_Paterno Like '%lopez%' And P.A_Materno
Like '%saldivar%' And (P.Nombre_1 + ' ' + P.Nombre_2) Like '%%'

El Plan de ejecucion de esta consulta tomo 8:35 minutos en genrarse. Por que
tanto?
Por favor, alguien tiene un documento o guia para configurar adecuadamente
(para optimizar consultas desde VB) el SQL Server.
Necesito sobre todo devolver rapidamente registro, pero siempre resultan
consultas lentas, muy muy lentas.
Ayudenme.

Gracias

Preguntas similare

Leer las respuestas

#6 Adrian D. Garcia
04/02/2004 - 00:50 | Informe spam
Si, esto va a mejorar la performance pero ten en cuenta que el indice solo
se utilizara siempre y cuando se hagan referencias a las primeras columnas
del indice. Por ejemplo, si solo busco por Nombre_1 y Nombre_2 el indice no
se va a ultilizar.

Otra forma de obtener un mejor rendimiento es agregar un archivo fisico a la
base de datos en un disco diferente al que esta la base y definir un nuevo
grupo de archivos. Cuando digo disco me refiero a un disco fisico, no a otra
particion. Luego recreas los indices de esa tabla en el nuevo grupo (ver BOL
CREATE INDEX ). Esto te va apermitir paralelizar las entradas/salidas
de los datos y los indices en mayor medida de que si lo tenes todo en el
mismo grupo de archivos..

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Gustavo Morales" wrote in message
news:
He logrado manejar mejor la respuesta con este SP
Es Dinamico pero los parametros pueden variar o no llegar todos.
Tengo varios indices. Aqui uso uno compuesto por A_Paterno, A_Materno,
Nombre_1 y Nombre_2
Esta bien, no?

Gracias por la atencion

CREATE PROCEDURE sp_ListaPersonasNombre @Paterno Varchar(50) = Null,
@Materno Varchar(50) = Null, @Nombre Varchar(50) = Null, @RUC Char(11) > Null
AS
Declare @strQuery As Varchar(5000)
Set @strQuery = 'Select [Ap. Paterno] = P.A_Paterno, ' +
'[Ap. Materno] = P.A_Materno, ' +
'[Nombre] = LTrim(RTrim(P.Nombre_1)) + '' '' +


LTrim(RTrim(P.Nombre_2)),
' +
'P.CUSSP, ' +
'P.DOCIDEN, ' +
'P.RUC ' +
'From Persona P With(Index(Ix_Per_Nombre)) ' +
'Inner Join Empresa E ' +
'On P.RUC = E.RUC Where '

If @Paterno Is Not Null
Set @strQuery = @strQuery + 'P.A_Paterno Like ''' + @Paterno + '%'' '

If @Materno Is Not Null
Begin
If @Paterno Is Not Null
Set @strQuery = @strQuery + 'And P.A_Materno Like ''' + @Materno + '%''


'
Else
Set @strQuery = @strQuery + 'P.A_Materno Like ''' + @Materno + '%'' '
End

If @Nombre Is Not Null
Begin
If (@Paterno Is Not Null Or @Materno Is Not Null)
Set @strQuery = @strQuery + 'And P.Nombre_1 + ''' + ''' + P.Nombre_2


Like
''%' + @Nombre + '%'' '
Else
Set @strQuery = @strQuery + 'P.Nombre_1 + ''' + ''' + P.Nombre_2 Like
''%' + @Nombre + '%'' '
End

If @RUC Is Not Null
Begin
If (@Paterno Is Not Null Or @Materno Is Not Null Or @Nombre Is Not Null)
Set @strQuery = @strQuery + 'And P.RUC = ''' + @RUC + ''''
Else
Set @strQuery = @strQuery + 'P.RUC = ''' + @RUC + ''''
End

Print @strQuery

Exec (@strQuery)
GO

"Adrian D. Garcia" escribió en el mensaje
news:#
> Hola Gustavo,
>
> Cuando haces un filtro del tipo
>
> P.A_Paterno Like '%lopez%'
>
> A SQL Server no le queda otro remedio que realizar untable scan o un
cluster
> index scan sobre la tabla, eso significa que ira leyendo fila a fila de


la
> tabla y luego realizara la comparacion. Por tus otras consultas estimo


que
> es la famosa tabla de 9.000.000 de filas.
> Si tienes indices sobre las columnas de caracteres, por ejemplo,


A_Paterno
> consultando de esta forma
>
> P.A_Paterno Like 'lopez%'
>
> Si utilizaria el indice correctamente, auqnue veo que estas consultando
por
> 3columnas de esta forma.
>
> Creo que la solucion que estas buscando es definir indices especiales de
> busqueda de texto. Fijate en los BOL sobre el tema "Full Text Search".
Creo
> que alli encontraras la solucion que estas buscando a tu problema de
> rendimiento.
>
> Saludos
> Adrian D. Garcia
> MCSD
> NDSoft Consultoria y Desarrollo
>
> "Gustavo Morales" wrote in message
> news:
> > Select [Ap. Paterno] = P.A_Paterno, [Ap. Materno] = P.A_Materno,
[Nombre]
> > > > LTrim(RTrim(P.Nombre_1)) + ' ' + LTrim(RTrim(P.Nombre_2)), P.CUSSP,
> > P.DOCIDEN, P.Sexo, P.Fecha_Nac, P.Domicilio, P.Distrito, P.Telefono,
> P.RUC,
> > P.EMail, P.Promedio From Persona P With(Index(Ix_Per_Nombre)) Inner


Join
> > Empresa E On P.RUC = E.RUC Where P.A_Paterno Like '%lopez%' And
> P.A_Materno
> > Like '%saldivar%' And (P.Nombre_1 + ' ' + P.Nombre_2) Like '%%'
> >
> > El Plan de ejecucion de esta consulta tomo 8:35 minutos en genrarse.


Por
> que
> > tanto?
> > Por favor, alguien tiene un documento o guia para configurar
adecuadamente
> > (para optimizar consultas desde VB) el SQL Server.
> > Necesito sobre todo devolver rapidamente registro, pero siempre


resultan
> > consultas lentas, muy muy lentas.
> > Ayudenme.
> >
> > Gracias
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Gustavo Morales
04/02/2004 - 01:34 | Informe spam
Toto totalmente claro.
Gracias

"Adrian D. Garcia" escribió en el mensaje
news:
Si, pero paralelismo de entrada y salida, no paralelismo en los planes de
ejecucion.

Si quieres tener paralelismo tambien a ese nivel, por ejemplo que SQL


Server
arme un plan de ejecucion tal que mientras procesa un serie de filas lea


al
mismo tiempo otras tienes que tener 2 o mas procesadores.

Asi que si deseas mejorar tu hardware busca de agregar otro procesador,
memoria suficiente (1 GB como para empezar) y por lo menos 2 o mas


conjuntos
de discos para separar fisicamente tu base de datos. Tambiens eria
conveniente que cada conjunto de discos tenga su propia placa controladora


o
si tienes una placa, que la misma soporte 2 o mas canales.

Con este hardware propuesto vas a tener paralelismo en la resolucion del
query y paralelismo en la entrada/salida.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Gustavo Morales" wrote in message
news:OX$
> Muchas gracias por la información. Voy a revisar lo que indicas.
Justamente
> quiero saber como configurar el SQL Server (corriendo en una pc con un
solo
> procesador) para que realiza paraleleismo.
> Entiendo que tu explicación va por ahi, no?
>
>
> "Adrian D. Garcia" escribió en el


mensaje
> news:#
> > Si, esto va a mejorar la performance pero ten en cuenta que el indice
solo
> > se utilizara siempre y cuando se hagan referencias a las primeras
columnas
> > del indice. Por ejemplo, si solo busco por Nombre_1 y Nombre_2 el


indice
> no
> > se va a ultilizar.
> >
> > Otra forma de obtener un mejor rendimiento es agregar un archivo


fisico
a
> la
> > base de datos en un disco diferente al que esta la base y definir un
nuevo
> > grupo de archivos. Cuando digo disco me refiero a un disco fisico, no


a
> otra
> > particion. Luego recreas los indices de esa tabla en el nuevo grupo


(ver
> BOL
> > CREATE INDEX ). Esto te va apermitir paralelizar las
entradas/salidas
> > de los datos y los indices en mayor medida de que si lo tenes todo en


el
> > mismo grupo de archivos..
> >
> > Saludos
> > Adrian D. Garcia
> > MCSD
> > NDSoft Consultoria y Desarrollo
> >
> > "Gustavo Morales" wrote in message
> > news:
> > > He logrado manejar mejor la respuesta con este SP
> > > Es Dinamico pero los parametros pueden variar o no llegar todos.
> > > Tengo varios indices. Aqui uso uno compuesto por A_Paterno,


A_Materno,
> > > Nombre_1 y Nombre_2
> > > Esta bien, no?
> > >
> > > Gracias por la atencion
> > >
> > > CREATE PROCEDURE sp_ListaPersonasNombre @Paterno Varchar(50) = Null,
> > > @Materno Varchar(50) = Null, @Nombre Varchar(50) = Null, @RUC


Char(11)
> > > > Null
> > > AS
> > > Declare @strQuery As Varchar(5000)
> > > Set @strQuery = 'Select [Ap. Paterno] = P.A_Paterno, ' +
> > > '[Ap. Materno] = P.A_Materno, ' +
> > > '[Nombre] = LTrim(RTrim(P.Nombre_1)) + '' '' +
> > LTrim(RTrim(P.Nombre_2)),
> > > ' +
> > > 'P.CUSSP, ' +
> > > 'P.DOCIDEN, ' +
> > > 'P.RUC ' +
> > > 'From Persona P With(Index(Ix_Per_Nombre)) ' +
> > > 'Inner Join Empresa E ' +
> > > 'On P.RUC = E.RUC Where '
> > >
> > > If @Paterno Is Not Null
> > > Set @strQuery = @strQuery + 'P.A_Paterno Like ''' + @Paterno +


'%''
'
> > >
> > > If @Materno Is Not Null
> > > Begin
> > > If @Paterno Is Not Null
> > > Set @strQuery = @strQuery + 'And P.A_Materno Like ''' + @Materno


+
> '%''
> > '
> > > Else
> > > Set @strQuery = @strQuery + 'P.A_Materno Like ''' + @Materno +


'%''
'
> > > End
> > >
> > > If @Nombre Is Not Null
> > > Begin
> > > If (@Paterno Is Not Null Or @Materno Is Not Null)
> > > Set @strQuery = @strQuery + 'And P.Nombre_1 + ''' + ''' +
P.Nombre_2
> > Like
> > > ''%' + @Nombre + '%'' '
> > > Else
> > > Set @strQuery = @strQuery + 'P.Nombre_1 + ''' + ''' + P.Nombre_2
> Like
> > > ''%' + @Nombre + '%'' '
> > > End
> > >
> > > If @RUC Is Not Null
> > > Begin
> > > If (@Paterno Is Not Null Or @Materno Is Not Null Or @Nombre Is Not
> Null)
> > > Set @strQuery = @strQuery + 'And P.RUC = ''' + @RUC + ''''
> > > Else
> > > Set @strQuery = @strQuery + 'P.RUC = ''' + @RUC + ''''
> > > End
> > >
> > > Print @strQuery
> > >
> > > Exec (@strQuery)
> > > GO
> > >
> > > "Adrian D. Garcia" escribió en el
> mensaje
> > > news:#
> > > > Hola Gustavo,
> > > >
> > > > Cuando haces un filtro del tipo
> > > >
> > > > P.A_Paterno Like '%lopez%'
> > > >
> > > > A SQL Server no le queda otro remedio que realizar untable scan o


un
> > > cluster
> > > > index scan sobre la tabla, eso significa que ira leyendo fila a


fila
> de
> > la
> > > > tabla y luego realizara la comparacion. Por tus otras consultas
estimo
> > que
> > > > es la famosa tabla de 9.000.000 de filas.
> > > > Si tienes indices sobre las columnas de caracteres, por ejemplo,
> > A_Paterno
> > > > consultando de esta forma
> > > >
> > > > P.A_Paterno Like 'lopez%'
> > > >
> > > > Si utilizaria el indice correctamente, auqnue veo que estas
> consultando
> > > por
> > > > 3columnas de esta forma.
> > > >
> > > > Creo que la solucion que estas buscando es definir indices
especiales
> de
> > > > busqueda de texto. Fijate en los BOL sobre el tema "Full Text
Search".
> > > Creo
> > > > que alli encontraras la solucion que estas buscando a tu problema


de
> > > > rendimiento.
> > > >
> > > > Saludos
> > > > Adrian D. Garcia
> > > > MCSD
> > > > NDSoft Consultoria y Desarrollo
> > > >
> > > > "Gustavo Morales" wrote in message
> > > > news:
> > > > > Select [Ap. Paterno] = P.A_Paterno, [Ap. Materno] = P.A_Materno,
> > > [Nombre]
> > > > > > > > > > LTrim(RTrim(P.Nombre_1)) + ' ' + LTrim(RTrim(P.Nombre_2)),
P.CUSSP,
> > > > > P.DOCIDEN, P.Sexo, P.Fecha_Nac, P.Domicilio, P.Distrito,
P.Telefono,
> > > > P.RUC,
> > > > > P.EMail, P.Promedio From Persona P With(Index(Ix_Per_Nombre))
Inner
> > Join
> > > > > Empresa E On P.RUC = E.RUC Where P.A_Paterno Like '%lopez%' And
> > > > P.A_Materno
> > > > > Like '%saldivar%' And (P.Nombre_1 + ' ' + P.Nombre_2) Like '%%'
> > > > >
> > > > > El Plan de ejecucion de esta consulta tomo 8:35 minutos en
genrarse.
> > Por
> > > > que
> > > > > tanto?
> > > > > Por favor, alguien tiene un documento o guia para configurar
> > > adecuadamente
> > > > > (para optimizar consultas desde VB) el SQL Server.
> > > > > Necesito sobre todo devolver rapidamente registro, pero siempre
> > resultan
> > > > > consultas lentas, muy muy lentas.
> > > > > Ayudenme.
> > > > >
> > > > > Gracias
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#8 Adrian D. Garcia
04/02/2004 - 01:55 | Informe spam
Si, pero paralelismo de entrada y salida, no paralelismo en los planes de
ejecucion.

Si quieres tener paralelismo tambien a ese nivel, por ejemplo que SQL Server
arme un plan de ejecucion tal que mientras procesa un serie de filas lea al
mismo tiempo otras tienes que tener 2 o mas procesadores.

Asi que si deseas mejorar tu hardware busca de agregar otro procesador,
memoria suficiente (1 GB como para empezar) y por lo menos 2 o mas conjuntos
de discos para separar fisicamente tu base de datos. Tambiens eria
conveniente que cada conjunto de discos tenga su propia placa controladora o
si tienes una placa, que la misma soporte 2 o mas canales.

Con este hardware propuesto vas a tener paralelismo en la resolucion del
query y paralelismo en la entrada/salida.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Gustavo Morales" wrote in message
news:OX$
Muchas gracias por la información. Voy a revisar lo que indicas.


Justamente
quiero saber como configurar el SQL Server (corriendo en una pc con un


solo
procesador) para que realiza paraleleismo.
Entiendo que tu explicación va por ahi, no?


"Adrian D. Garcia" escribió en el mensaje
news:#
> Si, esto va a mejorar la performance pero ten en cuenta que el indice


solo
> se utilizara siempre y cuando se hagan referencias a las primeras


columnas
> del indice. Por ejemplo, si solo busco por Nombre_1 y Nombre_2 el indice
no
> se va a ultilizar.
>
> Otra forma de obtener un mejor rendimiento es agregar un archivo fisico


a
la
> base de datos en un disco diferente al que esta la base y definir un


nuevo
> grupo de archivos. Cuando digo disco me refiero a un disco fisico, no a
otra
> particion. Luego recreas los indices de esa tabla en el nuevo grupo (ver
BOL
> CREATE INDEX ). Esto te va apermitir paralelizar las


entradas/salidas
> de los datos y los indices en mayor medida de que si lo tenes todo en el
> mismo grupo de archivos..
>
> Saludos
> Adrian D. Garcia
> MCSD
> NDSoft Consultoria y Desarrollo
>
> "Gustavo Morales" wrote in message
> news:
> > He logrado manejar mejor la respuesta con este SP
> > Es Dinamico pero los parametros pueden variar o no llegar todos.
> > Tengo varios indices. Aqui uso uno compuesto por A_Paterno, A_Materno,
> > Nombre_1 y Nombre_2
> > Esta bien, no?
> >
> > Gracias por la atencion
> >
> > CREATE PROCEDURE sp_ListaPersonasNombre @Paterno Varchar(50) = Null,
> > @Materno Varchar(50) = Null, @Nombre Varchar(50) = Null, @RUC Char(11)
> > Null
> > AS
> > Declare @strQuery As Varchar(5000)
> > Set @strQuery = 'Select [Ap. Paterno] = P.A_Paterno, ' +
> > '[Ap. Materno] = P.A_Materno, ' +
> > '[Nombre] = LTrim(RTrim(P.Nombre_1)) + '' '' +
> LTrim(RTrim(P.Nombre_2)),
> > ' +
> > 'P.CUSSP, ' +
> > 'P.DOCIDEN, ' +
> > 'P.RUC ' +
> > 'From Persona P With(Index(Ix_Per_Nombre)) ' +
> > 'Inner Join Empresa E ' +
> > 'On P.RUC = E.RUC Where '
> >
> > If @Paterno Is Not Null
> > Set @strQuery = @strQuery + 'P.A_Paterno Like ''' + @Paterno + '%''


'
> >
> > If @Materno Is Not Null
> > Begin
> > If @Paterno Is Not Null
> > Set @strQuery = @strQuery + 'And P.A_Materno Like ''' + @Materno +
'%''
> '
> > Else
> > Set @strQuery = @strQuery + 'P.A_Materno Like ''' + @Materno + '%''


'
> > End
> >
> > If @Nombre Is Not Null
> > Begin
> > If (@Paterno Is Not Null Or @Materno Is Not Null)
> > Set @strQuery = @strQuery + 'And P.Nombre_1 + ''' + ''' +


P.Nombre_2
> Like
> > ''%' + @Nombre + '%'' '
> > Else
> > Set @strQuery = @strQuery + 'P.Nombre_1 + ''' + ''' + P.Nombre_2
Like
> > ''%' + @Nombre + '%'' '
> > End
> >
> > If @RUC Is Not Null
> > Begin
> > If (@Paterno Is Not Null Or @Materno Is Not Null Or @Nombre Is Not
Null)
> > Set @strQuery = @strQuery + 'And P.RUC = ''' + @RUC + ''''
> > Else
> > Set @strQuery = @strQuery + 'P.RUC = ''' + @RUC + ''''
> > End
> >
> > Print @strQuery
> >
> > Exec (@strQuery)
> > GO
> >
> > "Adrian D. Garcia" escribió en el
mensaje
> > news:#
> > > Hola Gustavo,
> > >
> > > Cuando haces un filtro del tipo
> > >
> > > P.A_Paterno Like '%lopez%'
> > >
> > > A SQL Server no le queda otro remedio que realizar untable scan o un
> > cluster
> > > index scan sobre la tabla, eso significa que ira leyendo fila a fila
de
> la
> > > tabla y luego realizara la comparacion. Por tus otras consultas


estimo
> que
> > > es la famosa tabla de 9.000.000 de filas.
> > > Si tienes indices sobre las columnas de caracteres, por ejemplo,
> A_Paterno
> > > consultando de esta forma
> > >
> > > P.A_Paterno Like 'lopez%'
> > >
> > > Si utilizaria el indice correctamente, auqnue veo que estas
consultando
> > por
> > > 3columnas de esta forma.
> > >
> > > Creo que la solucion que estas buscando es definir indices


especiales
de
> > > busqueda de texto. Fijate en los BOL sobre el tema "Full Text


Search".
> > Creo
> > > que alli encontraras la solucion que estas buscando a tu problema de
> > > rendimiento.
> > >
> > > Saludos
> > > Adrian D. Garcia
> > > MCSD
> > > NDSoft Consultoria y Desarrollo
> > >
> > > "Gustavo Morales" wrote in message
> > > news:
> > > > Select [Ap. Paterno] = P.A_Paterno, [Ap. Materno] = P.A_Materno,
> > [Nombre]
> > > > > > > > LTrim(RTrim(P.Nombre_1)) + ' ' + LTrim(RTrim(P.Nombre_2)),


P.CUSSP,
> > > > P.DOCIDEN, P.Sexo, P.Fecha_Nac, P.Domicilio, P.Distrito,


P.Telefono,
> > > P.RUC,
> > > > P.EMail, P.Promedio From Persona P With(Index(Ix_Per_Nombre))


Inner
> Join
> > > > Empresa E On P.RUC = E.RUC Where P.A_Paterno Like '%lopez%' And
> > > P.A_Materno
> > > > Like '%saldivar%' And (P.Nombre_1 + ' ' + P.Nombre_2) Like '%%'
> > > >
> > > > El Plan de ejecucion de esta consulta tomo 8:35 minutos en


genrarse.
> Por
> > > que
> > > > tanto?
> > > > Por favor, alguien tiene un documento o guia para configurar
> > adecuadamente
> > > > (para optimizar consultas desde VB) el SQL Server.
> > > > Necesito sobre todo devolver rapidamente registro, pero siempre
> resultan
> > > > consultas lentas, muy muy lentas.
> > > > Ayudenme.
> > > >
> > > > Gracias
> > > >
> > > >
> > >
> > >
> >
> >
>
>


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