Problema al ejecutar mi aplicación

Hola, espero q me puedas ayudar te cuento;
Ya realize la aplicación la probé con una bd con 100 reg y normal, pero ahora le puse una bd de 15millones de registros y cuando le doy ejecutar se demora en salir la ventana y cuando doy los parámetros(elijo sueldo, banco, etc) también se demora.
Mi compu es de 512mb disco 40gb, si supieras una forma de como hacerlo más rapido te agradecería mucho.
Atentamente
MigueL

1 Respuesta

Respuesta
1
Para empezar, tu pc es un poco chica, por las características que me dices. Las bases de datos que manejan millones de registros, deberían esar alojadas en un servidor mucho más potente, y no en una PC
Para agilizar las consultas en una base de datos con tablas gigantes, lo que debes hacer es crear indices a los campos consultados.
Osea, por ejemplo, si tienes una tabla Alumnos, no solo debe tener el PrimaryKey cod_alumno como un único indice, también debes ponerle indices a los campos críticos, como por ejemplo cod_apellido, de manera que si haces un select * from alumnos where apellido = 'Lopez' va hacer que el resultado demore menos, que si no tuviera el indice.
En el ejemplo que vimos, deberías indizar los campos bco, scotiabank, interbak
saludos,
Fernando
Hola, gracias por la respuesta pero te cuento paso por paso
1º.- Cuando creo el grid, selecciono la tabla y luego los campos ya hasta ahí chevere pero cuando empiza a cargar todos los registros que hay en esa tabla (15m aprox.) se demora en cargar es más se cuelga mi pc sale memoria virtual muy bajo y al final se cierra pb y nada no puedo cargar hasta ahora los registros al grid, quería saber si hay otra forma realizar grid más rapido.
Nota: mi bd esta en otra maquina yo me conecto a la base por medio del odbc
Espero me puedas ayudar por que no se como hacer correr la aplicación :(
Atentamente.
MigueL
Para, empezar, ¿cómo cargas los 15 millones de registros?, si es con un retrieve() solamente, obvio que debe demorar, ya que el retrieve() los carga uno por uno.
Por otro lado, en que PC tienes la base de datos, y que motor de datos es (SQL Server, Anywhere, MySQL). Si la PC que tiene la base de datos es una de 512 de RAM, no esperes milagros para 15 millones de registros, es muy chica, ademas que esta en red.
Ahora, el mensaje que te muestra es bien claro, no te queda más memoria para tener en la RAM cada uno de los 15 millones, recuerda que un DataWindow Grid, es un objeto y cada uno de los registros que tiene, se maneja como un array de 15 millones de filas, osea, el problema no es el tamaño de la tabla, sino que estas cargando 15 millones de filas en un DW.
Lo ideal seria que le pongas un parámetro para que no cargues los 15 millones de registros, creo que a ningún usuario le va a gustar tener una ventana y buscar lo que quiere en 15 millones de filas, puedes poner un filtro el cual maneje tal vez un rango de fechas, o un rango de códigos,
me parece que esta mal planteado presentar al usuario tantas filas en una ventana, creo que debes plantear un poco mejor tu diseño y funcionalidad de la ventana.
Si quieres, dame más datos del programa, para ayudarte un poco más,
Fernando
Mira como te explico, yo tengo una base que me entregaron con 15m de registros y me van hacer consultas a mi como por ejemplo(miguel quiero cuantos registros tienes con estas características: sexo=m edad=20-50 estcivi=s sueldo=1500-3500 cuentas=bcp, scotianbank) y lo que debo hacer con el programa es realizar ese filtrado para solo sacar un numero, no me piden quienes son sino cuantos(según el filtrado digo: hay 1'500,000 de registros con esas características) por eso hago el filtrado pero tengo problemas con el grid no se que solución me darías o como lo realizaría de mejor forma.
Y si el grid lo hago con un retrieve, esa es la única forma que se de hacer un grid:
Los paso que sigo son: selecciono grid, sql select, selecciono la tabla, escojo los campos, conver to sintaxis y luego retirve
Espero que la explicación sea clara
Atentamente.
MigueL
El servidor es de las siguientes características:
SO: W server 2000,1gb RAM
Uso sql server 2000
Si necesitas saber algo más solo dime
Aver, si lo que te piden es la cantidad de registros, puedes usar lo siguiente:
LONG ll_total
SELECT COUNT(*) INTO :ll_total FROM tabla WHERE
(edad >= 20 and edad <= 50) AND
estciv = 's' AND
(sueldo >= 1500 and sueldo <= 3500) AND
bcp > 0 AND scotiabanck > 0
En este caso, te guarda el total de registros que cumplen con la condición WHERE en la variable ll_total, y ese dato se lo muestras al usuario.
Esto debe funcionar, pero en este caso, no olvides crear los indices correspondiente para los campos que consultas en el WHERE, osea, para edad, estciv, etc.
Creo que algo no me entendiste, mira los de la edad, sexo etc puede cambiar por ejemplo hoy me piden cuantos registros tengo con sexo=m edad=15-36 estcivil=s cuentas bcp pero mañana me dan otros rango como sexo=m y f edad >50 estacil=todos cuantas bcp y scotiabank y así pueden ir cambiando los datos a buscar por eso realize ese programita para aver si me podría agilizar las cosas.
Trabajo para una empresa de Georefencia por eso manejamos muchos registros.
Espero me entiendas
Atentamente.
MigueL
Claro, si entendí, yo te puse un ejemplo genérico.
Aver, te voy a indicar una manera de hacerlo, usando la función SetSQLSelect del datawindow, con la que puedes cambiar el SELECT del DW en tiempo de ejecución.
1. Crea un FreeForm de tipo external con los siguientes datos:
edad_ini (numerico)
edad_fin (numerico)
estciv (string(1))
sueldo_ini (numerico)
sueldo_fin (numerico)
bcp(numérico)
scotiabank(numerico)
interbank(numerico)
Esto lo acomodas de una manera agradable al usuario, por ejemplo en el campo estciv, puedes crear un DropDownLisBox, (en la pestaña edit), ingresando en "Code Table" los elementos del DropDownLisBox:
S = Soltero
C = Casado
V = Viudo
D = Divorciado
T = Todos
Tambien deberias cambiar en StyleType a EditMask (###,###.00) para los datos de sueldo_ini, sueldo_fin, bcp, Scotiabank, Interbank
La edad_ini y edad_fin tambien deberian ser EditMask, pero solo con (##), ya que no se manejan decimales en la edad.
Lo guardas con el nombre dw_1
2. Aquí viene la parte buena, creas un FreeForm que va a contener el cálculo que queremos.
- Te vas a Nuevo / DataWindow / FreeForm,
- le indicas en Data Source a "Quick Select" - Next -
- Seleccionas la tabla que contiene los datos (en mi ejemplo se llama a1a)
- Seleccionas cualquier campo para que se active el botón OK - le das OK
- Next - Finish
- Cuando aparezca el Painter del datawindow, has click en el botón "Data Source", si no lo encuentras, anda al menu Design / DataSource
- Una vez que aparezca el diseño del DataSource, selecciona el menu Design / Convert To Sintaxis
- Aquí aparece el SELECT, que uno puede alterar manualmente cuando nuestra consulta no puede representarse gráficamente.
- Borra lo que aparece y reemplázalo por:
SELECT COUNT(*) AS TOTAL FROM a1a
//El Where se lo vamos a meter por codigo segun nuestras condiciones.
- haces click en el boton return
- Acomoda los 2 objetos de manera presentable, ponle un fondo plomo por ejemplo al dato, y en negrita
- Lo guardas con el nombre dw_total
3. Acomodas estos 2 DW en una ventana, dw_1 (dataobject = dw_1), y dw_2 (dataobject = dw_total)
- Le creas 2 botones, uno que diga Consulta, y otro que diga Salir.
- En el botón salir puedes ponerle el código :
Close(Parent)
Y marcas la opción Cancel, para poder cerrarlo pulsando escape
En el evento open de la ventana ingresa:
dw_1.InsertRow(0)
y en el evento clicked del boton Consulta ingresa:
dw_1.AcceptText()
Integer li_edad_ini, li_edad_fin
string ls_estciv
decimal ld_sueldo_ini,ld_sueldo_fin, ld_bcp, ld_scotiabank, ld_interbank
// Capturamos los datos del dw
li_edad_ini = dw_1.object.edad_ini[1]
li_edad_fin = dw_1.object.edad_fin[1]
ls_estciv = dw_1.object.estciv[1]
ld_sueldo_ini = dw_1.object.sueldo_ini[1]
ld_sueldo_fin = dw_1.object.sueldo_fin[1]
ld_bcp = dw_1.object.bcp[1]
ld_scotiabank = dw_1.object.scotiabank[1]
ld_interbank = dw_1.object.interbank[1]
String ls_where = "", ls_sql
// EDAD
If not IsNull(li_edad_ini) and not IsNull(li_edad_fin) and li_edad_ini > 0 and li_edad_fin > 0 then
ls_where = ls_where + " AND (edad >= " + string(li_edad_ini) + " AND edad <= " + string(li_edad_fin) + ")"
end if
// Estado Civil
If not IsNull(ls_estciv) and ls_estciv <> "T" then
ls_where = ls_where + " AND estciv = '" + trim(ls_estciv) + "'"
end if
// SUELDO
If not IsNull(ld_sueldo_ini) and not IsNull(ld_sueldo_fin) and ld_sueldo_ini > 0 and ld_sueldo_fin > 0 then
ls_where = ls_where + " AND (sueldo >= " + string(ld_sueldo_ini) + " AND sueldo <= " + string(ld_sueldo_fin) + ")"
end if
//BCP
If not IsNull(ld_bcp) then
ls_where = ls_where + " AND bcp >= " + string(ld_bcp)
end if
//scotiabank
If not IsNull(ld_scotiabank) then
ls_where = ls_where + " AND scotiabank >= " + string(ld_scotiabank)
end if
//scotiabank
If not IsNull(ld_interbank) then
ls_where = ls_where + " AND interbank >= " + string(ld_interbank)
end if
If len(ls_where) > 0 Then
ls_where = " WHERE "+ right(ls_where, len(ls_where) - 5)
End If
ls_sql = " SELECT COUNT(*) AS TOTAL FROM a1a " + ls_where
messagebox(ls_where,ls_sql)
dw_2.SetSQLSelect(ls_sql)
//Aqui se cambia el SELECT con el WHERE de nuestra consulta
dw_2.SetTransObject(SQLCA)
dw_2.Retrieve()
Ahora pruébalo, debe funcionar.
Verifica el nombre de tu tabla para que puedas ponerla en la variable ls_sql, ya que yo uso el nombre de mi tabla que se llama "a1a"
He tratado de explicarte lo más claro que pude.
Wow... realmente fenomenal se soluciono mi problema ahora a lo mucho de demora 2 min gracias por la ayuda. Pero ahora quisiera saber como hago un ejecutable para una pc que no tiene power builder instalado.
Espero que me puedas ayudar
Atentamente.
MigueL
Que bueno que funcionó.
Para crear un ejecutable, puedes seguir los siguientes pasos:
(Yo uso la version 10.5, puede variar un poco en cada version)
1. Menu New
2. En la ventana New te vas al tab "Projet" y "seleccionas" Application
3. Seleccionas el nombre del archivo en "Executable file name"
4. Seleccionas los datos adicionales, como el nombre de la compañía, del producto, etc.
5. Abajo, en la lista "Library" te aparecen todas las PBL de tu aplicación, posiblemente solo tengas una. Marca todos los checks que dice PBD
6. Haces click en Deploy, y va a compilar tu ejecutable
7. Copia en la PC cliente, el archivo ejecutable que se creo, junto con los archivos PBD que se crearon debe ser un PBD por cada PBL.
8. Ejecuta el ejecutable en la PC del cliente,
9. Cuando corrar el EXE te va a mostrar un error que faltan algunos DLL copiar junto al EXE con los PBD, los DLLs los puedes encontrar en la carpeta:
C:\Archivos de programa\Sybase\Shared\PowerBuilder
Copiarlos conforme te vaya pidiendo.
Espero te sirva.
Si tienes alguna duda me la haces saber, aunque seria bueno que cerraras la pregunta anterior (la del select count(*)) para que poder ver este nuevo tema en una sección nueva.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas