Problemas con tiempos de expiracion de mi sistema

03/03/2005 - 23:55 por German | Informe spam
Mi consulta es la siguiente,

En mi base de datos tengo una tabla con alrededor de 6 000 000 de registros
de nombre de personas y empresas. Yo necesito realizar busquedas por nombre y
devolver a la aplicacion
las primeras 250 coincidendias, para eso utilizo el like '%' + StringABuscar
'%', y sobre el campo nombre tengo creado un indice. He realizado pruebas y
cuando realizo busquedas con coincidencias este me las devuelve en un tiempo
optimo, sin embargo cuando hago busqueda con palabras que no tienen
coincidencias sobre la tabla, la consulta agota el tiempo de expiracion del
sistema y el programa se cae. Alguien me puede dar una ayuda para resolver
este inconveniente.

. MI llave primaria es una identificacion de tipo numerica ya que necesito
trabajar con otras tablas relacionadas.

Gracias.

German.

Preguntas similare

Leer las respuestas

#1 MAXI
04/03/2005 - 00:40 | Informe spam
Hola German para esto te aconsejo que utilices fulltextsearch (no se como se
dice en español :()



Maxi
Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)



"German" escribió en el mensaje
news:
Mi consulta es la siguiente,

En mi base de datos tengo una tabla con alrededor de 6 000 000 de
registros
de nombre de personas y empresas. Yo necesito realizar busquedas por
nombre y
devolver a la aplicacion
las primeras 250 coincidendias, para eso utilizo el like '%' +
StringABuscar
'%', y sobre el campo nombre tengo creado un indice. He realizado pruebas
y
cuando realizo busquedas con coincidencias este me las devuelve en un
tiempo
optimo, sin embargo cuando hago busqueda con palabras que no tienen
coincidencias sobre la tabla, la consulta agota el tiempo de expiracion
del
sistema y el programa se cae. Alguien me puede dar una ayuda para resolver
este inconveniente.

. MI llave primaria es una identificacion de tipo numerica ya que necesito
trabajar con otras tablas relacionadas.

Gracias.

German.
Respuesta Responder a este mensaje
#2 Jorge Bustos
04/03/2005 - 01:05 | Informe spam
Ten en cuenta que la búsqueda que quieres realizar implica recorrer todos
los 6.000.000 de campos de texto, uno a uno, para buscar las coincidencias.
Y, además, no existe modo de optimizarla mediante índices.

Quizás te convenga más utilizar las funcionalidades de full text search.
Echa un vistazo a:
CONTAINS
FREETEXT
y temas relacionados en los BOL

Un saludo,
Jorge Bustos

"German" wrote in message
news:
Mi consulta es la siguiente,

En mi base de datos tengo una tabla con alrededor de 6 000 000 de


registros
de nombre de personas y empresas. Yo necesito realizar busquedas por


nombre y
devolver a la aplicacion
las primeras 250 coincidendias, para eso utilizo el like '%' +


StringABuscar
'%', y sobre el campo nombre tengo creado un indice. He realizado pruebas


y
cuando realizo busquedas con coincidencias este me las devuelve en un


tiempo
optimo, sin embargo cuando hago busqueda con palabras que no tienen
coincidencias sobre la tabla, la consulta agota el tiempo de expiracion


del
sistema y el programa se cae. Alguien me puede dar una ayuda para resolver
este inconveniente.

. MI llave primaria es una identificacion de tipo numerica ya que


necesito
trabajar con otras tablas relacionadas.

Gracias.

German.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
04/03/2005 - 01:55 | Informe spam
German,

Cuando usas el operador de comparacion LIKE y el primer caracter del patron
es el '%', entonces la expresion no es considerada un argumento de busqueda y
por lo tanto sql server no hara uso de algun indice definido por esa columna.

Ejemplo:

use northwind
go

execute sp_helpindex employees
go

set showplan_text on
go

select lastname, firstname, employeeid
from dbo.employees
where lastname like '%a%'
go

set showplan_text off
go

Veras que en el plan de ejecucion, sql server prefirio scanear el indice
clustered y no hacer un "index seek" del indice "LastName". Si ahora ejecutas:

set showplan_text on
go

select lastname, firstname, employeeid
from dbo.employees
where lastname like '%a%'
go

set showplan_text off
go

Veras que esta vez sql server escoge hacer un "Index Seek" en "LastName"
seguido por un "Bookmark Lookup", puesto que el indice es nonclustered.

Coincido con Maxi y Jorge, que para busquedas de patrones de caracteres con
este nivel de complejidad tendrias mejor resultado si usas el servicio
full-text search.


AMB

"German" wrote:

Mi consulta es la siguiente,

En mi base de datos tengo una tabla con alrededor de 6 000 000 de registros
de nombre de personas y empresas. Yo necesito realizar busquedas por nombre y
devolver a la aplicacion
las primeras 250 coincidendias, para eso utilizo el like '%' + StringABuscar
'%', y sobre el campo nombre tengo creado un indice. He realizado pruebas y
cuando realizo busquedas con coincidencias este me las devuelve en un tiempo
optimo, sin embargo cuando hago busqueda con palabras que no tienen
coincidencias sobre la tabla, la consulta agota el tiempo de expiracion del
sistema y el programa se cae. Alguien me puede dar una ayuda para resolver
este inconveniente.

. MI llave primaria es una identificacion de tipo numerica ya que necesito
trabajar con otras tablas relacionadas.

Gracias.

German.
Respuesta Responder a este mensaje
#4 Alejandro Mesa
04/03/2005 - 01:59 | Informe spam
Correccion,

Si ahora ejecutas:

set showplan_text on
go

select lastname, firstname, employeeid
from dbo.employees
where lastname like 'a%'
go

set showplan_text off
go
...


AMB

"Alejandro Mesa" wrote:

German,

Cuando usas el operador de comparacion LIKE y el primer caracter del patron
es el '%', entonces la expresion no es considerada un argumento de busqueda y
por lo tanto sql server no hara uso de algun indice definido por esa columna.

Ejemplo:

use northwind
go

execute sp_helpindex employees
go

set showplan_text on
go

select lastname, firstname, employeeid
from dbo.employees
where lastname like '%a%'
go

set showplan_text off
go

Veras que en el plan de ejecucion, sql server prefirio scanear el indice
clustered y no hacer un "index seek" del indice "LastName". Si ahora ejecutas:

set showplan_text on
go

select lastname, firstname, employeeid
from dbo.employees
where lastname like '%a%'
go

set showplan_text off
go

Veras que esta vez sql server escoge hacer un "Index Seek" en "LastName"
seguido por un "Bookmark Lookup", puesto que el indice es nonclustered.

Coincido con Maxi y Jorge, que para busquedas de patrones de caracteres con
este nivel de complejidad tendrias mejor resultado si usas el servicio
full-text search.


AMB

"German" wrote:

> Mi consulta es la siguiente,
>
> En mi base de datos tengo una tabla con alrededor de 6 000 000 de registros
> de nombre de personas y empresas. Yo necesito realizar busquedas por nombre y
> devolver a la aplicacion
> las primeras 250 coincidendias, para eso utilizo el like '%' + StringABuscar
> '%', y sobre el campo nombre tengo creado un indice. He realizado pruebas y
> cuando realizo busquedas con coincidencias este me las devuelve en un tiempo
> optimo, sin embargo cuando hago busqueda con palabras que no tienen
> coincidencias sobre la tabla, la consulta agota el tiempo de expiracion del
> sistema y el programa se cae. Alguien me puede dar una ayuda para resolver
> este inconveniente.
>
> . MI llave primaria es una identificacion de tipo numerica ya que necesito
> trabajar con otras tablas relacionadas.
>
> Gracias.
>
> German.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida