Búsquedas indexadas

30/12/2004 - 10:53 por Laforge | Informe spam
Hola,

Mi duda es la siguiente:

Con el antiquísimo VB4.0 (...es que no tengo referencias posteriores hasta
el .NET), para realizar búsquedas en BBDD en campos indexados se asignaba
una PrimaryKey y una Key al RecordSet para después hacer la búsqueda
utilizando la instrucción SEEK, la cual era MUCHÍSIMO más rápida que hacer
un SELECT puro y duro (sobretodo en PC tipo 286 y similares...). En .NET
cómo ha evolucionado eso? Por lo que estuve viendo, cuando utilizas el
wizard para crear los DataAdapters, al finalizar, si la tabla escogida tiene
campos clave, te dice que las insrucciones SELECT, INSERT,...etc han sido
creadas correctamente. En cambio, si la tabla seleccionada NO tiene un campo
clave asignado, te da varios warnings. ¿Quiere decir esto que el DataAdapter
ya se encarga de asignar los campos clave a las tablas que lo tienen para
agilizar las búsquedas? y, si no es así, ¿cómo puedo hacerlo? ¿hay alguna
forma de agilizar las búsquedas de registros en BBDD con campos clave
utilizando sentencias SQL? o por contra ¿debería cargar TODA la BBDD a un
DataSet y después hacer una búsqueda en DataSet?


Gracias y Felices Fiestas.

Preguntas similare

Leer las respuestas

#1 SqlRanger
31/12/2004 - 11:30 | Informe spam
Comentarios en línea

"Laforge" escribió en el mensaje
news:#
Hola,

Mi duda es la siguiente:

Con el antiquísimo VB4.0 (...es que no tengo referencias posteriores hasta
el .NET), para realizar búsquedas en BBDD en campos indexados se asignaba
una PrimaryKey y una Key al RecordSet para después hacer la búsqueda
utilizando la instrucción SEEK, la cual era MUCHÍSIMO más rápida que hacer
un SELECT puro y duro (sobretodo en PC tipo 286 y similares...). En .NET
cómo ha evolucionado eso?



Esto era cierto, y lo sigue siendo con DAO y ADO classic para bases de datos
ISAM como dBase, FoxPro, Access, etc. Pero para sistemas de bases de datos
cliente-servidor como SQL Server, Oracle, etc, nunca ha existido la
posibilidad de hacer un "seek" sobre un índice. En estos sistemas de base de
datos las búsquedas se realizan siempre con instrucciones SELECT poniendo en
la cláusula WHERE la condición de búsqueda, el sistema de base de datos se
encarga de usar los índices adecuados y buscar el algoritmo más eficiente
para resolver la consulta.

En .NET ya no existe la posibilidad de hacer un "seek" relegando de esta
manera a las bases de datos tipo ISAM.

Por lo que estuve viendo, cuando utilizas el
wizard para crear los DataAdapters, al finalizar, si la tabla escogida


tiene
campos clave, te dice que las insrucciones SELECT, INSERT,...etc han sido
creadas correctamente. En cambio, si la tabla seleccionada NO tiene un


campo
clave asignado, te da varios warnings.



Cuando una tabla no tiene clave primaria, el asistente no es capaz de
generar las instrucciones de actualización, es decir las instrucciones
UPDATE y DELETE. Esto es debido a que estas instrucciones tienen en la
cláusula WHERE el valor original de la clave primaria. La clave primaria es
necesaria para poder identificar un registro, si no existe ¿cómo es posible
identificar el registro que se quiere eliminar o actualizar por medio de una
instrucción UPDATE o DELETE?, sencillamente no es posible.

¿Quiere decir esto que el DataAdapter
ya se encarga de asignar los campos clave a las tablas que lo tienen para
agilizar las búsquedas?



El DataAdapter es solo un intermediario entre la base de datos y el dataset.
Se encarga de cargar (método Fill) en el dataset los datos provenientes de
la base de datos y de revertir (método Update) las modificaciones hechas en
el datset sobre la base de datos.

Un dataadapter no tiene mucho que ver con agilizar búsquedas. La agilización
de las búsquedas debe realizarse en el sistema de base de datos, hablando de
sistemas de base de datos cliente-servidor como SQL Server, etc. Creando los
índices adecuados.


y, si no es así, ¿cómo puedo hacerlo? ¿hay alguna
forma de agilizar las búsquedas de registros en BBDD con campos clave
utilizando sentencias SQL? o por contra ¿debería cargar TODA la BBDD a un
DataSet y después hacer una búsqueda en DataSet?



Una búsqueda debería ser realizada por el propio sistema de base de datos al
ejecutar la instrucción SELECT. Al DataAdapter se le proporciona la
instrucción SELECT con la cláusula WHERE especificando la condición de
búsqueda. Luego se llama a Fill para tener en el dataset los registros que
cumplen con esa condición de búsqueda.

Sería un error cargar toda una tabla de la base de datos en un DataSet.
mucho peor sería cargar toda la base de datos en el DataSet. El sistema de
base de datos ya tiene mecanismos optimizados para hacer búsquedas:
instrucciones select con cláusulas where. En sistemas de bases de datos
ISAM, puede que no estén muy optimizadas y que sea preferible usar "seeks"
sobre índices, pero debido a que esta posibilidad ha desaparecido en .NET ,
no queda más remedio que usar SELECT's con WHERE's. Repito y recalco que no
es una buena idea cargar la base de datos entera en un dataset y hacer ahí
la búsqueda.



Gracias y Felices Fiestas.







Saludos:

Jesús López
MVP
Respuesta Responder a este mensaje
#2 Laforge
05/01/2005 - 16:34 | Informe spam
Muchas gracias. IMPECABLE!

"SqlRanger" escribió en el mensaje
news:
Comentarios en línea

"Laforge" escribió en el mensaje
news:#
> Hola,
>
> Mi duda es la siguiente:
>
> Con el antiquísimo VB4.0 (...es que no tengo referencias posteriores


hasta
> el .NET), para realizar búsquedas en BBDD en campos indexados se


asignaba
> una PrimaryKey y una Key al RecordSet para después hacer la búsqueda
> utilizando la instrucción SEEK, la cual era MUCHÍSIMO más rápida que


hacer
> un SELECT puro y duro (sobretodo en PC tipo 286 y similares...). En .NET
> cómo ha evolucionado eso?

Esto era cierto, y lo sigue siendo con DAO y ADO classic para bases de


datos
ISAM como dBase, FoxPro, Access, etc. Pero para sistemas de bases de datos
cliente-servidor como SQL Server, Oracle, etc, nunca ha existido la
posibilidad de hacer un "seek" sobre un índice. En estos sistemas de base


de
datos las búsquedas se realizan siempre con instrucciones SELECT poniendo


en
la cláusula WHERE la condición de búsqueda, el sistema de base de datos se
encarga de usar los índices adecuados y buscar el algoritmo más eficiente
para resolver la consulta.

En .NET ya no existe la posibilidad de hacer un "seek" relegando de esta
manera a las bases de datos tipo ISAM.

>Por lo que estuve viendo, cuando utilizas el
> wizard para crear los DataAdapters, al finalizar, si la tabla escogida
tiene
> campos clave, te dice que las insrucciones SELECT, INSERT,...etc han


sido
> creadas correctamente. En cambio, si la tabla seleccionada NO tiene un
campo
> clave asignado, te da varios warnings.

Cuando una tabla no tiene clave primaria, el asistente no es capaz de
generar las instrucciones de actualización, es decir las instrucciones
UPDATE y DELETE. Esto es debido a que estas instrucciones tienen en la
cláusula WHERE el valor original de la clave primaria. La clave primaria


es
necesaria para poder identificar un registro, si no existe ¿cómo es


posible
identificar el registro que se quiere eliminar o actualizar por medio de


una
instrucción UPDATE o DELETE?, sencillamente no es posible.

>¿Quiere decir esto que el DataAdapter
> ya se encarga de asignar los campos clave a las tablas que lo tienen


para
> agilizar las búsquedas?

El DataAdapter es solo un intermediario entre la base de datos y el


dataset.
Se encarga de cargar (método Fill) en el dataset los datos provenientes de
la base de datos y de revertir (método Update) las modificaciones hechas


en
el datset sobre la base de datos.

Un dataadapter no tiene mucho que ver con agilizar búsquedas. La


agilización
de las búsquedas debe realizarse en el sistema de base de datos, hablando


de
sistemas de base de datos cliente-servidor como SQL Server, etc. Creando


los
índices adecuados.


>y, si no es así, ¿cómo puedo hacerlo? ¿hay alguna
> forma de agilizar las búsquedas de registros en BBDD con campos clave
> utilizando sentencias SQL? o por contra ¿debería cargar TODA la BBDD a


un
> DataSet y después hacer una búsqueda en DataSet?

Una búsqueda debería ser realizada por el propio sistema de base de datos


al
ejecutar la instrucción SELECT. Al DataAdapter se le proporciona la
instrucción SELECT con la cláusula WHERE especificando la condición de
búsqueda. Luego se llama a Fill para tener en el dataset los registros que
cumplen con esa condición de búsqueda.

Sería un error cargar toda una tabla de la base de datos en un DataSet.
mucho peor sería cargar toda la base de datos en el DataSet. El sistema de
base de datos ya tiene mecanismos optimizados para hacer búsquedas:
instrucciones select con cláusulas where. En sistemas de bases de datos
ISAM, puede que no estén muy optimizadas y que sea preferible usar "seeks"
sobre índices, pero debido a que esta posibilidad ha desaparecido en .NET


,
no queda más remedio que usar SELECT's con WHERE's. Repito y recalco que


no
es una buena idea cargar la base de datos entera en un dataset y hacer ahí
la búsqueda.

>
>
> Gracias y Felices Fiestas.
>
>
>


Saludos:

Jesús López
MVP



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