Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ADO lento (https://www.clubdelphi.com/foros/showthread.php?t=12802)

CHiCoLiTa 28-07-2004 13:14:19

ADO lento
 
Hola a todos

Estoy atacando una Base de Datos en SQL Server y me conecto mediante ADO

Realizo una consulta que me devuelve la oficina, cuenta y entidad y yo actualizo el digito de control que venia en blanco.

El programa funciona y todo muy bonito

Pero es exageradamente lento. Lo he ejecutado directamente en el servidor y el resultado es el mismo.

He probado a solo seleccionar 10 registros y tambien va muy lento y el codigo tan solo hace lo siguiente

Ahh, lo que se llama Tabla realmente es un AdoQuery, a ver si seleccionando solo los registros que tiene entidad funcionaba
Y la funcion Cero, añade ceros a la izquierda para la longitud dada

Código Delphi [-]
    Tabla.Open;
    tabla.First;
    while not tabla.Eof do
    begin
        banco := tabla.FieldByName('BANCO').Value + tabla.FieldByName('SUCURSAL').Value;
        entidad := Cero(tabla.FieldByName('CUENTA').Value, 10);
        DC := IntToStr(CalculaDC(banco, entidad));
        DC := Cero(DC, 2);
        tabla.Edit;
        tabla.FieldByName('CUENTA').AsString := entidad;
        tabla.FieldByName('DC').AsString := DC;
        tabla.post;
        tabla.Next;
    end;
    Tabla.Close;

Es cuestiones del ADO y me tengo que resignar o hay algun parametro que se pueda cambiar? O alguna otra forma de atacar al SQL que sea mas rapida, ya sea ODBC con el DBE

Un Saludo

guillotmarc 28-07-2004 13:23:11

Hola.

¿ Estás seguro que el problema són los componentes ADO ?. Dices que tienes el mismo resultado ejecutandolo directamente en el Servidor ¿ cierto ?, en ese caso no tiene nada que ver con los componentes de acceso utilizados desde Delphi.

Revisa los triggers que pueda haber en esa tabla, los índices que utilizas en la consulta, etc. ...

NOTA: ¿ Exactamente cuanto tiempo tarda el proceso ?, ¿ y para cuantos registros ?

Saludos.

CHiCoLiTa 28-07-2004 13:38:51

La verdad es que no se cual puede ser el problema.
Pense que podia ser la red, por eso lo ejecute en el servidor directamente
Luego pense que el problema podria ser que son muchos registros por eso probe con tan solo 10
Y como el codigo no tiene 'nada' pienso que el problema puede ser ese, pero estoy un pcoo perdido

Uso los componentes ADO que vienen con Delphi 6
La tabla no tiene ningun tipo de triggers, indice, ni nada de nada
Son aproximadamente 800.000 registros y tarda en actualizar cada registro aproximadamente medio segundo

__marcsc 28-07-2004 14:07:16

Hola,

detalle importante: Cuando dices que lo ejecutas directamente en el servidor... ejecutas tu aplicación desde el servidor, no? Yo creo que lo mejor sería que intentases algún update directamente desde el Query Analyzer a ver qué te hace.

Otra cosa interesante sería que esta actualización la realizaras mediante un Stored Procedure para descartar que se trate de los componentes ADO.

Temas relacionados con ADO:

Qué tipo de cursor utilizas? Has Probado a utilizar BatchUpdates?

Temas de servidor:

Esta tabla está indexada correctamente? Has verificado el tamaño de la BD? Tienes algun indice clustered? Has utilizado algún plan de mantenimiento para reducir el tamaño de la BD??

Suerte!

Neftali [Germán.Estévez] 28-07-2004 14:42:40

Cita:

Empezado por CHiCoLiTa
La tabla no tiene ningun tipo de triggers, indice, ni nada de nada

Haz pruebas definiendo índices en tu tabla.

En cuanto a propiedades de ADO haz pruebas con:
* CursorLocation = clServer.
* CursorType = ctOpenForwardOnly (sube rendimiento vbastante si no vas a realizar recorridos hacia adelante y atrás).

Creo que si el recorrido lo haces por un índice ganarás bastante.

¿Tienes controles DataAware ligados a esos campos? No creo, pero si es así desactivalos (DisableControls) y al acabar los vuelves a activar.

CHiCoLiTa 28-07-2004 16:09:01

En efecto, he indexado la tabla y se han actualizado los registros a una velocidad medianamente normal y rapida.

Antes de hacerlo tambien probe a ejecturalo desde el servidor mediante: CursorLocation = clServer. y aalgo gane en velocidad, pero seguia siendo el proceso muy lento

En un principio pense que podria ser el ADO, porque creo recordar haber leido que cuando abres una tabla por ADO, te carga los datos en memoria

Muchas gracias a todos y un saludo

Neftali [Germán.Estévez] 28-07-2004 17:59:46

Cita:

Empezado por CHiCoLiTa
En un principio pense que podria ser el ADO, porque creo recordar haber leido que cuando abres una tabla por ADO, te carga los datos en memoria

Justo eso es lo que defines con el CursorLocation. Que te carge todos los registros en memoria o que te carge un bloque y a medida que vas necesitando que te vaya cargando el resto.


La franja horaria es GMT +2. Ahora son las 04:29:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi