Author | Topic: lentitud de acceso a bases de datos | |
---|---|---|
Ernesto Avedillo | lentitud de acceso a bases de datos on Fri, 24 Mar 2006 10:16:19 +0100 Hola todos, he leido el problema que tiene merche en relacion a la lentitud de acceso a las bases de datos y creo que me podreis dar alguna ayuda. La rutina de la que voy a hablar es la siguiente: (AreaConc)->( DbSetFilter( {||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },; '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' ) ) (AreaConc)->( DBGoTop() ) Do While !(AreaConc)->( EOF() ) AADD(aCompOld, {(AreaConc)->Num_Comp , (AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2}) (AreaConc)->( DBSkip() ) EndDo Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He realizado un estudio de tiempos y me he dado cuenta de que la sentencia DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un registro) Cuando borro todos los indices la rutina funciona volando, sin embargo, a medida que pasa el tiempo el problema va degenerando tanto que me ha llegado a colgar el servidor por su lentitud. Me imagino que este es el mismo problema que tiene merche? No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca y si lo he hecho no me he enterado. Alguien me puede explicar lo que es? Actualmente trabajo con la version 1.9 de XBASE y las bases de datos son DBF grandes e hasta 2000 registros. Gracias Ernesto | |
Pablo Botella | Re: lentitud de acceso a bases de datos on Fri, 24 Mar 2006 12:40:57 +0100 Hola, Bueno vamos por pasos > No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca > y si lo he hecho no me he enterado. Alguien me puede explicar lo que es? El colector de basura es un mecanismo interno del runtime de Xbase++ ( Clipper tambien tiene su GC) para asignar memoria a las variables y liberarla cuando no hace falta. Tu no haces nada explcito para utilizarlo ( en clipper se poda activar explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan el CG ms que otras. Concretamente aadd() es una de las que mas le "duelen" al CG. > Actualmente trabajo con la version 1.9 de XBASE y las bases de datos son > DBF grandes e hasta 2000 registros. Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le siguen doliendo, se nota mucho menos. De todas formas intentar sacar un poquito de tiempo este fin de semana para publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll que incluso con 1.9 la diferencia de velocidad no solo se sigue notando sino que adems el impacto sobre el sistema en infinitamente menor que usando aadd() ( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto el ejemplo con los mismos tipos y asi casi te valdria tal cual) Ahora vamos con lo del filtro Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( NumMezcla , n , nn ) si es numrico ) deberas reemplazar el filtro por un scope y si no tienes deberas planteartelo, dependiendo de la frecuencia con que necesites hacer esta operacin. En tu caso lo tienes muy fcil porque el filtro es simple (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) ) o (AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla ,n,nn) ) ) si es numerico Cuando son filtros ms complicados lo que se debe hacer es tratar de reemplazar parte del filtro por un scope lo mas restrictivo posible y as se evaluan cuantos menos registros mejor. Saludos, Pablo Botella ------------------------------------------------------- Get The Open Tools for Xbase++ here: http://www.xbwin.com ------------------------------------------------------- | |
Ernesto Avedillo | Re: lentitud de acceso a bases de datos on Fri, 24 Mar 2006 15:54:23 +0100 Hola Pablo, La base de datos AreaConc tiene los siguietes Campos; NumMezcla,"C" , 13, 0 Num_Comp, "C" , 13, 0 P_Peso , "N" , 7 , 3 Lab , "L" , 1 , 0 Fase2 , "L" , 1 , 0 Y esta indexada por NumMezcla + Num_Comp En relacion al setScope recuerdo que inicialmente tenia programada la rutina de esta manera, pero en determinadas ocasiones (No hablo exclusivamente de esta base de datos sino en otras tantas) no me realizaba correctamente la operacin y finalmente decidi utilizar el DBSetFilter. En relacion a este punto, he de decir que he llegado a sustituir la funcion DBSetScope por SET SCOPE TO porque la primera me ha dado ciertos problemas que me solventaba la segunda. (seguro que la culpa es mia pero no he sabido manejarla correctamente). Lo que realmente me sorprende es que cuando borro los indices y los vuelvo a crear nuevos, el programa no tarda nada en realizar la operacin, pero si espero unas horas en las que haya trabajado con la base de datos, empiezo a tener problemas de velocidad. Ademas, me he encontrado que la lentitud me la causa el DBSKIP; hasta 8 segundos me ha llegado a tardar una sola sentencia en ejecutarse (slo un registro). Gracias Ernesto "Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje news:787ef152$2b418107$22170c@news.alaska-software.com... > Hola, > > Bueno vamos por pasos > >> No se lo que es el Garbage colector. Sinceramente no lo he utilizado >> nunca >> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es? > El colector de basura es un mecanismo interno del runtime de Xbase++ ( > Clipper tambien tiene su GC) > para asignar memoria a las variables y liberarla cuando no hace falta. Tu > no > haces nada explcito para utilizarlo ( en clipper se poda activar > explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan el > CG ms que otras. > > Concretamente aadd() es una de las que mas le "duelen" al CG. > >> Actualmente trabajo con la version 1.9 de XBASE y las bases de datos son >> DBF grandes e hasta 2000 registros. > > Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le > siguen doliendo, se nota mucho menos. > De todas formas intentar sacar un poquito de tiempo este fin de semana > para publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll > que incluso con 1.9 la diferencia de velocidad no solo se sigue notando > sino que adems el impacto sobre el sistema en infinitamente menor que > usando aadd() > > ( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto > el ejemplo con los mismos tipos y asi casi te valdria tal cual) > > Ahora vamos con lo del filtro > > Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( > NumMezcla , n , nn ) si es numrico ) > deberas reemplazar el filtro por un scope y si no tienes deberas > planteartelo, dependiendo de la frecuencia con que necesites hacer esta > operacin. > > En tu caso lo tienes muy fcil porque el filtro es simple > > (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) ) > o > (AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla > ,n,nn) ) ) > si es numerico > > Cuando son filtros ms complicados lo que se debe hacer es tratar de > reemplazar parte del filtro por un scope lo mas restrictivo posible > y as se evaluan cuantos menos registros mejor. > > Saludos, > Pablo Botella > ------------------------------------------------------- > Get The Open Tools for Xbase++ > here: http://www.xbwin.com > ------------------------------------------------------- > > | |
Nolberto Paulino | Re: lentitud de acceso a bases de datos on Fri, 24 Mar 2006 11:04:54 -0400 Hola Hernesto Este codigo de Palblo funciona perfectamenta (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) ) (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) ) tambien puede hacerlo de esta forma (AreaConc)->( DbSetScope( SCOPE_TOP , (AreaPadre)->NumMezcla ) ) (AreaConc)->( DbSetScope( SCOPE_BOTTOM , (AreaPadre)->NumMezcla ) ) si esto no te funciona por favor explica mejor lo que quiere lograr con los filtros de Indices. Nolberto Paulino Un cordiar saludo "Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> escribi en el mensaje news:7e8478e1$26213350$22880b@news.alaska-software.com... > Hola Pablo, > > La base de datos AreaConc tiene los siguietes Campos; > > NumMezcla,"C" , 13, 0 > Num_Comp, "C" , 13, 0 > P_Peso , "N" , 7 , 3 > Lab , "L" , 1 , 0 > Fase2 , "L" , 1 , 0 > > Y esta indexada por NumMezcla + Num_Comp > > En relacion al setScope recuerdo que inicialmente tenia programada la > rutina de esta manera, pero en determinadas ocasiones (No hablo > exclusivamente de esta base de datos sino en otras tantas) no me realizaba > correctamente la operacin y finalmente decidi utilizar el DBSetFilter. > En relacion a este punto, he de decir que he llegado a sustituir la > funcion DBSetScope por SET SCOPE TO porque la primera me ha dado ciertos > problemas que me solventaba la segunda. (seguro que la culpa es mia pero > no he sabido manejarla correctamente). > > Lo que realmente me sorprende es que cuando borro los indices y los vuelvo > a crear nuevos, el programa no tarda nada en realizar la operacin, pero > si espero unas horas en las que haya trabajado con la base de datos, > empiezo a tener problemas de velocidad. Ademas, me he encontrado que la > lentitud me la causa el DBSKIP; hasta 8 segundos me ha llegado a tardar > una sola sentencia en ejecutarse (slo un registro). > > Gracias > Ernesto > > "Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje > news:787ef152$2b418107$22170c@news.alaska-software.com... >> Hola, >> >> Bueno vamos por pasos >> >>> No se lo que es el Garbage colector. Sinceramente no lo he utilizado >>> nunca >>> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es? >> El colector de basura es un mecanismo interno del runtime de Xbase++ ( >> Clipper tambien tiene su GC) >> para asignar memoria a las variables y liberarla cuando no hace falta. Tu >> no >> haces nada explcito para utilizarlo ( en clipper se poda activar >> explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan >> el >> CG ms que otras. >> >> Concretamente aadd() es una de las que mas le "duelen" al CG. >> >>> Actualmente trabajo con la version 1.9 de XBASE y las bases de datos >>> son >>> DBF grandes e hasta 2000 registros. >> >> Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le >> siguen doliendo, se nota mucho menos. >> De todas formas intentar sacar un poquito de tiempo este fin de semana >> para publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll >> que incluso con 1.9 la diferencia de velocidad no solo se sigue notando >> sino que adems el impacto sobre el sistema en infinitamente menor que >> usando aadd() >> >> ( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto >> el ejemplo con los mismos tipos y asi casi te valdria tal cual) >> >> Ahora vamos con lo del filtro >> >> Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( >> NumMezcla , n , nn ) si es numrico ) >> deberas reemplazar el filtro por un scope y si no tienes deberas >> planteartelo, dependiendo de la frecuencia con que necesites hacer esta >> operacin. >> >> En tu caso lo tienes muy fcil porque el filtro es simple >> >> (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) ) >> o >> (AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla >> ,n,nn) ) ) >> si es numerico >> >> Cuando son filtros ms complicados lo que se debe hacer es tratar de >> reemplazar parte del filtro por un scope lo mas restrictivo posible >> y as se evaluan cuantos menos registros mejor. >> >> Saludos, >> Pablo Botella >> ------------------------------------------------------- >> Get The Open Tools for Xbase++ >> here: http://www.xbwin.com >> ------------------------------------------------------- >> >> > > | |
Pablo Botella | Re: lentitud de acceso a bases de datos on Fri, 24 Mar 2006 17:52:18 +0100 Ernesto, Prueba esto aItems := (AreaConc)->(ColectConcItems((AreaPadre)->NumMezcla)) a ver como te trabaja ( tienes que enlazarlo con ot4xb.lib ) y luego me cuentas si hay diferencia. ( Ojo: En el build 1.2.102 del ot4xb met unos simbolos que se dan de narices con la V 1.9 de Xbase++ asegrate de que usas el ultimo ot4xb - Build 1.2.103 que puse ayer en la web ) Saludos, Pablo Botella ------------------------------------------------------- Get The Open Tools for Xbase++ here: http://www.xbwin.com ------------------------------------------------------- --------------------------------------------------------------------------- #include "ot4xb.ch" --------------------------------------------------------------------------- BEGIN STRUCTURE _AreaConc_Item_ MEMBER POINTER32 pNext MEMBER LONG nPos MEMBER BINSTR Num_Comp SIZE 13 MEMBER DOUBLE P_Peso MEMBER BOOL Lab MEMBER BOOL Fase2 END STRUCTURE --------------------------------------------------------------------------- function ColectConcItems( cNumMezcla ) local oItem := _AreaConc_Item_():New() local nItemSize := oItem:_sizeof_() local pFirst := _xgrab(nItemSize) local p := 0 local pp := 0 local nCount := 0 local aItems p := pFirst oItem:_link_(p,.F.) DbGoTop() DbSeek( cNumMezcla , .F.) while( (!Eof()) .and. (FIELD->NumMezcla == cNumMezcla) ) nCount++ p := _xgrab(nItemSize) oItem:pNext := p oItem:_link_(p,.F.) oItem:nPos := nCount oItem:Num_Comp := FIELD->Num_Comp oItem:P_Peso := FIELD->P_Peso oItem:Lab := FIELD->Lab oItem:Fase2 := FIELD->Fase2 DbSkip() end aItems := Array( nCount , 4 ) oItem:_link_(pFirst,.F.) p := oItem:pNext while( p != 0 ) oItem:_link_(p,.F.) p := oItem:pNext aItems[oItem:nPos][1] := oItem:Num_Comp aItems[oItem:nPos][2] := oItem:P_Peso aItems[oItem:nPos][3] := oItem:Lab aItems[oItem:nPos][4] := oItem:Fase2 oItem:_free_(.F.) end oItem:_link_(pFirst,.F.) oItem:_free_(.F.) return aItems --------------------------------------------------------------------------- ernesto.zip | |
Ernesto Avedillo | Re: lentitud de acceso a bases de datos on Mon, 27 Mar 2006 09:30:29 +0200 Hola Pablo, Ya lo he integrado en la rutina, vere como funciona entre hoy y maana y te contare algo. Gracias de antemano Ernesto "Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje news:6013cf25$6dbbdd6e$22b1d8@news.alaska-software.com... > Ernesto, > > Prueba esto > aItems := (AreaConc)->(ColectConcItems((AreaPadre)->NumMezcla)) > a ver como te trabaja ( tienes que enlazarlo con ot4xb.lib ) y luego me > cuentas si hay diferencia. > > ( Ojo: En el build 1.2.102 del ot4xb met unos simbolos que se dan de > narices con la V 1.9 de Xbase++ asegrate de que usas el ultimo ot4xb - > Build 1.2.103 que puse ayer en la web ) > > Saludos, > Pablo Botella > ------------------------------------------------------- > Get The Open Tools for Xbase++ > here: http://www.xbwin.com > ------------------------------------------------------- > > > --------------------------------------------------------------------------- > #include "ot4xb.ch" > --------------------------------------------------------------------------- > BEGIN STRUCTURE _AreaConc_Item_ > MEMBER POINTER32 pNext > MEMBER LONG nPos > MEMBER BINSTR Num_Comp SIZE 13 > MEMBER DOUBLE P_Peso > MEMBER BOOL Lab > MEMBER BOOL Fase2 > END STRUCTURE > --------------------------------------------------------------------------- > function ColectConcItems( cNumMezcla ) > local oItem := _AreaConc_Item_():New() > local nItemSize := oItem:_sizeof_() > local pFirst := _xgrab(nItemSize) > local p := 0 > local pp := 0 > local nCount := 0 > local aItems > p := pFirst > oItem:_link_(p,.F.) > > DbGoTop() > DbSeek( cNumMezcla , .F.) > while( (!Eof()) .and. (FIELD->NumMezcla == cNumMezcla) ) > nCount++ > p := _xgrab(nItemSize) > oItem:pNext := p > oItem:_link_(p,.F.) > oItem:nPos := nCount > oItem:Num_Comp := FIELD->Num_Comp > oItem:P_Peso := FIELD->P_Peso > oItem:Lab := FIELD->Lab > oItem:Fase2 := FIELD->Fase2 > DbSkip() > end > > aItems := Array( nCount , 4 ) > > oItem:_link_(pFirst,.F.) > p := oItem:pNext > > while( p != 0 ) > oItem:_link_(p,.F.) > p := oItem:pNext > aItems[oItem:nPos][1] := oItem:Num_Comp > aItems[oItem:nPos][2] := oItem:P_Peso > aItems[oItem:nPos][3] := oItem:Lab > aItems[oItem:nPos][4] := oItem:Fase2 > oItem:_free_(.F.) > end > oItem:_link_(pFirst,.F.) > oItem:_free_(.F.) > > return aItems > --------------------------------------------------------------------------- > > > > | |
Jorge Gabuardi | Re: lentitud de acceso a bases de datos on Mon, 27 Mar 2006 20:26:17 -0600 Ernesto Estoy seguro que las aportaciones de todas las personas son adecuadas y mejoraran el "performance", pero una de las instrucciones que estan afectando severamente tu programa especialmente si tu archivo tiene muchos registros es: DbSetFilter( ) (solo se debe de usar en muy contadas ocasiones), cambiala por la sugerencia de Paulino DbSetScope() esta funcion trabaja con los indices (los debes tener activados) y es muchisimo mas rapida. saludos Jorge "Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> wrote in message news:c8508d7$740dceca$219897@news.alaska-software.com... > > Hola todos, he leido el problema que tiene merche en relacion a la > lentitud de acceso a las bases de datos y creo que me podreis dar alguna > ayuda. > > La rutina de la que voy a hablar es la siguiente: > > (AreaConc)->( DbSetFilter( > {||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },; > > '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' ) ) > (AreaConc)->( DBGoTop() ) > Do While !(AreaConc)->( EOF() ) > AADD(aCompOld, {(AreaConc)->Num_Comp , > (AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2}) > (AreaConc)->( DBSkip() ) > EndDo > > Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He > realizado un estudio de tiempos y me he dado cuenta de que la sentencia > DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un > registro) > > Cuando borro todos los indices la rutina funciona volando, sin embargo, a > medida que pasa el tiempo el problema va degenerando tanto que me ha > llegado a colgar el servidor por su lentitud. > > Me imagino que este es el mismo problema que tiene merche? > > No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca > y si lo he hecho no me he enterado. Alguien me puede explicar lo que es? > > Actualmente trabajo con la version 1.9 de XBASE y las bases de datos son > DBF grandes e hasta 2000 registros. > > Gracias > Ernesto > > | |
Ernesto Avedillo | Re: lentitud de acceso a bases de datos on Tue, 28 Mar 2006 13:33:46 +0200 Hla a todos; Muchas gracias por vuestra ayuda, me ha servido de gran ayuda. Pablo, en especial a ti porque con tu rutina he conseguido bajar el tiempo de proceso de 50 a 0,2 segundos, algo que hasta hoy era impensable para mi. Saludos Ernesto "Jorge Gabuardi" <jgabuardi@prodigy.net.mx> escribi en el mensaje news:147acaf$3f614323$25357b@news.alaska-software.com... > > Ernesto > > Estoy seguro que las aportaciones de todas las personas son adecuadas y > mejoraran el "performance", pero una de las instrucciones que estan > afectando severamente tu programa especialmente si tu archivo tiene muchos > registros es: DbSetFilter( ) (solo se debe de usar en muy contadas > ocasiones), cambiala por la sugerencia de Paulino DbSetScope() esta > funcion trabaja con los indices (los debes tener activados) y es muchisimo > mas rapida. > > saludos > > Jorge > > "Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> wrote in message > news:c8508d7$740dceca$219897@news.alaska-software.com... >> >> Hola todos, he leido el problema que tiene merche en relacion a la >> lentitud de acceso a las bases de datos y creo que me podreis dar alguna >> ayuda. >> >> La rutina de la que voy a hablar es la siguiente: >> >> (AreaConc)->( DbSetFilter( >> {||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },; >> >> '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' ) ) >> (AreaConc)->( DBGoTop() ) >> Do While !(AreaConc)->( EOF() ) >> AADD(aCompOld, {(AreaConc)->Num_Comp , >> (AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2}) >> (AreaConc)->( DBSkip() ) >> EndDo >> >> Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He >> realizado un estudio de tiempos y me he dado cuenta de que la sentencia >> DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un >> registro) >> >> Cuando borro todos los indices la rutina funciona volando, sin embargo, a >> medida que pasa el tiempo el problema va degenerando tanto que me ha >> llegado a colgar el servidor por su lentitud. >> >> Me imagino que este es el mismo problema que tiene merche? >> >> No se lo que es el Garbage colector. Sinceramente no lo he utilizado >> nunca y si lo he hecho no me he enterado. Alguien me puede explicar lo >> que es? >> >> Actualmente trabajo con la version 1.9 de XBASE y las bases de datos son >> DBF grandes e hasta 2000 registros. >> >> Gracias >> Ernesto >> >> > > > |