tengo una dbf con mas de 300,000 registros y quiero hacer filtros por _, probe el setfilter pero es muy lento, he hecho scopes con el campo como llave y va muy bien, mi pregunta es:
es necesario tener el indice por el scope que se necesita para hacer el filtro? o que me recomiendan para hacer multi-filtros rapidos?
salu2
gracias
Paco
filtros con scopes..
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Hay 2 formas la primera es aplicar el SCOPE y luego un filtro sobre el scope, lo cual resulta mucho mas rapido porque hay que filtrar menos datos, pero de entrada, siempre es necesario que exista un indice para poder "scopear".
Lo que yo hago, es hacer multiples indices con multiples llaves para hacer "multi-filtros" como tu los llamas, ya que capacidad de un CDX es de hasta 50 indices por archivo, tengo DBFs que tiene mas de 35 ordenes en cada CDX, basado en combiancines de campos y clauslas restrictivias (INDEX ON campo+otrocampo+ campo TAG nombre FOR condicion)y funcionan bastante bien. Eso cuando tengo que trabajar con CDX puros y duros.
Cuando trabajas con ADS puedes utilizar Queries de SQL que funcionan alucinamente bien, o bien los famoso AOF (Advantage Optimized Filters) que son filtros sumamente eficientes y super rapidos basados en la funcion DBSETFILTER
Lo que yo hago, es hacer multiples indices con multiples llaves para hacer "multi-filtros" como tu los llamas, ya que capacidad de un CDX es de hasta 50 indices por archivo, tengo DBFs que tiene mas de 35 ordenes en cada CDX, basado en combiancines de campos y clauslas restrictivias (INDEX ON campo+otrocampo+ campo TAG nombre FOR condicion)y funcionan bastante bien. Eso cuando tengo que trabajar con CDX puros y duros.
Cuando trabajas con ADS puedes utilizar Queries de SQL que funcionan alucinamente bien, o bien los famoso AOF (Advantage Optimized Filters) que son filtros sumamente eficientes y super rapidos basados en la funcion DBSETFILTER
Saludos
R.F.
R.F.
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
- Biel EA6DD
- Posts: 680
- Joined: Tue Feb 14, 2006 9:48 am
- Location: Mallorca
- Contact:
Yo hago algo parecido, monto unos cuantos indices. Cuando voy a filtrar, segun los datos que me han introducido elijo el filtro que creo que me va a devolver menor numero de registros despues de hacer un scope.( si tengo indice por fecha e indice por cliente, si quieren filtrar por cliente y fecha, cojo scope de cliente que casi seguro es mas pequeno que por fecha), y sobre el resultado si me quedan campos para filtrar, creo un indice custom. Con el indice custom siempre sera mas rapido para manipular el resultado(browse, listados,...) que no con un filtro. Un filtro evalua el codeblock de filtro por cada registro, con el indice custom, solo una vez al crearlo.
Cada inidice adicional, hace que sea mas lento los procesos de acutlizacion de la tabla, aunque CDX es muy rapido, lo importante es encontrar un buen equilibrio(como todo en la vida).
Esa es la opinion de un novato(cada dia intento aprender mas, pero todavia me queda mucho).
Cada inidice adicional, hace que sea mas lento los procesos de acutlizacion de la tabla, aunque CDX es muy rapido, lo importante es encontrar un buen equilibrio(como todo en la vida).
Esa es la opinion de un novato(cada dia intento aprender mas, pero todavia me queda mucho).
Paco:
Por no dejar podrías probar sin tener que hacer ningun SCOPE ni FILTER, por ejemplo si quiero leer el detalle de una factura cuyo índice esta formado por _ DET_FAC + DET_PRO (Número de factura y código del producto facturado) hago lo siguiente:
(cDetFac)->(DBSEEK((cHdrFac)HDR_FAC))
// El puntero se coloca en el primer registro del detalle de la factura
DO WHILE (cDetFac)->(! EOF()) .AND.;
(cDetFac)->DET_FAC == (cHdrFac)->HDR_FAC
.....
..... // Resto del código para listar el detalle
.....
(cDetFac)->(DBSKIP())
ENDDO
Evidentemente esto no te libera de tener los TAG necesarios, pero como bien explicó el Master René, eso no es mayor problema.
Un Abrazo, Armando
Por no dejar podrías probar sin tener que hacer ningun SCOPE ni FILTER, por ejemplo si quiero leer el detalle de una factura cuyo índice esta formado por _ DET_FAC + DET_PRO (Número de factura y código del producto facturado) hago lo siguiente:
(cDetFac)->(DBSEEK((cHdrFac)HDR_FAC))
// El puntero se coloca en el primer registro del detalle de la factura
DO WHILE (cDetFac)->(! EOF()) .AND.;
(cDetFac)->DET_FAC == (cHdrFac)->HDR_FAC
.....
..... // Resto del código para listar el detalle
.....
(cDetFac)->(DBSKIP())
ENDDO
Evidentemente esto no te libera de tener los TAG necesarios, pero como bien explicó el Master René, eso no es mayor problema.
Un Abrazo, Armando
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero