SQL con dao o ado? consultas
Hola colega, estoy realizando un programa que consulta 3 millones de registros, pero el gran problema es que a la hora de realizar las consultas se tarda una eternidad en encontrar el registro dependiendo de la posición que se encuentre. El indice que declare para realizar las consultas es la cedula de la persona, utilizo instrucciones sql pero de igual manera no me sirve. La base de datos esta echa en Access pero fue de una migracion que realize ya que la misma estaba en formato de archivo de texto y no poseia campos por lo que importe el archivo a access y realize los pasos necesarios para la importacion del mismo y de esta manera pude lograr la tabla que necesitaba con sus campos y toda la información. Lo he realizado en ado pero no hayo la manera de que funcione y lo estoy realizando en dao pero tampoco, agradeceria mucho de tu ayuda para poder solucionar este gran problema.. Gracias de antemano. Aqui presento el codigo que realize:
Public DataBase As DataBase
Public vzla6 As Recordset
Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
'Set vzla6 = DataBase.OpenRecordset("Flecedvnz6", dbOpenTable)
Set vzla6 = DataBase.OpenRecordset("SELECT cedula FROM flecedvnz6")
End Sub
'
'select cedula from flecedvnz6 where cedula > 17000000 and cedula < 13000000;
Private Sub TXTcedula_Change()
On Error GoTo 30
vzla6.MoveFirst
Do While Not vzla6.EOF
If TXTcedula <> vzla6!cedula Then
vzla6.MoveNext
Else
llenar
Exit Do
End If
Loop
30
If Err.Number = 3022 Then
er = MsgBox("No existe la cédula de identidad en la Base de Datos", vbCritical)
limpiar
TXTcedula.SetFocus
End If
End Sub
Agradezco mucho tu ayuda..
Public DataBase As DataBase
Public vzla6 As Recordset
Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
'Set vzla6 = DataBase.OpenRecordset("Flecedvnz6", dbOpenTable)
Set vzla6 = DataBase.OpenRecordset("SELECT cedula FROM flecedvnz6")
End Sub
'
'select cedula from flecedvnz6 where cedula > 17000000 and cedula < 13000000;
Private Sub TXTcedula_Change()
On Error GoTo 30
vzla6.MoveFirst
Do While Not vzla6.EOF
If TXTcedula <> vzla6!cedula Then
vzla6.MoveNext
Else
llenar
Exit Do
End If
Loop
30
If Err.Number = 3022 Then
er = MsgBox("No existe la cédula de identidad en la Base de Datos", vbCritical)
limpiar
TXTcedula.SetFocus
End If
End Sub
Agradezco mucho tu ayuda..
tambien se podria probar utilizando un filtro para buscar x cantidad de registros o bien un find para buscar uno solamente
rs.filter=cedula='" & txtcedula.text & "'"
el filter hara que el recordset muestres todos los registros que coincidan con los parametros que le diste
rs.find "cedula='" & cedula.text & "'",,,1
el recordset se posicionara en el primer registro que coincida con los parametros dados partiendo desde el primero, si no encuentra nada entonces rs.eof sera verdadera
estas dos opciones son mucho mas rapido que la comparacion ciclica que muestras
rs.filter=cedula='" & txtcedula.text & "'"
el filter hara que el recordset muestres todos los registros que coincidan con los parametros que le diste
rs.find "cedula='" & cedula.text & "'",,,1
el recordset se posicionara en el primer registro que coincida con los parametros dados partiendo desde el primero, si no encuentra nada entonces rs.eof sera verdadera
estas dos opciones son mucho mas rapido que la comparacion ciclica que muestras
Hola, la verdad es que nunca he trabajado con tal cantidad de registros, pero podrÃas probar a hacer consultas más selectivas procurando ser lo más precisas posible. Es decir... con tal cantidad de registros nunca hagas un Select cedula FROM Tabla y ya está porque tienes que tener en cuenta que la información que recoge un RecordSet lo que hace es generar una "tabla" en memoria... es decir, se lee todos los registros fÃsicos de la tabla que entren en el criterio que le has dicho y se genera una tabla virtual (por decirlo asÃ). Es decir, si lo que quieres es que cuando el usuario teclee algo se busque un registro que empieze por esos caracteres podrÃas hacer lo siguiente...
Public DataBase As DataBase
Public vzla6 As Recordset
Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
End Sub
Private Sub TXTcedula_Change()
Dim qd As QueryDef
Dim rs As RecordSet
Set qd = DataBase.CreateQueryDef("")
qd.SQL = "PARAMETERS Ced STRING;SELECT Cedula FROM Tabla WHERE Cedula LIKE 'Ced%'"
qd![Ced] = Cedula.Text
Set rs= qd.OpenRecordset
IF Not rs.EOF Then
'Aquà lo que tengas que hacer
End
Set rs = Nothing
Set qd = Nothing
End Sub
Bueno, espero haberte ayudado.
Public DataBase As DataBase
Public vzla6 As Recordset
Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
End Sub
Private Sub TXTcedula_Change()
Dim qd As QueryDef
Dim rs As RecordSet
Set qd = DataBase.CreateQueryDef("")
qd.SQL = "PARAMETERS Ced STRING;SELECT Cedula FROM Tabla WHERE Cedula LIKE 'Ced%'"
qd![Ced] = Cedula.Text
Set rs= qd.OpenRecordset
IF Not rs.EOF Then
'Aquà lo que tengas que hacer
End
Set rs = Nothing
Set qd = Nothing
End Sub
Bueno, espero haberte ayudado.
