Lentidão em 3 camadas
Pessoal, estou desenvolvendo um sistema com SQL SERVER 2000 + ADO.
Quando faço uma consulta, apenas utilizando o componente TADODataSet ela demora 4 segundos para executar.
Se acrescento um TDataSetProvider e um ClientDataSet o tempo de resposta passa a ser de 40 segundos, via MIDAS.
Esse overhead todo é por causa do sistema multicamadas do delphi (tecnologia MIDAS)?
Gostaria de comentários a respeito e saber como vocês estão resolvendo esse problema.
Agradeço desde já a atenção.
Saudações,
Guilherme
Quando faço uma consulta, apenas utilizando o componente TADODataSet ela demora 4 segundos para executar.
Se acrescento um TDataSetProvider e um ClientDataSet o tempo de resposta passa a ser de 40 segundos, via MIDAS.
Esse overhead todo é por causa do sistema multicamadas do delphi (tecnologia MIDAS)?
Gostaria de comentários a respeito e saber como vocês estão resolvendo esse problema.
Agradeço desde já a atenção.
Saudações,
Guilherme
Gmcouto
Curtidas 0
Respostas
Vinicius2k
08/06/2004
Colega,
Nunca trabalhei com esta arquitetura em 3 camadas (ADO), uso dbExpress, mas o problema [b:bc127d5335]pode ser[/b:bc127d5335] na configuração do TClientDataSet...
A propriedade ´PacketRecords´ determina o número de registros que serão ´fetched´ para o cliente, o valor default eh ´-1´, ou seja, todos os registros, e isso em tabelas grandes é o caos... configure com o valor que achar adequado baseado nos seus testes (normalmente uso 1000), o fetch ocorrerá conforme necessário...
Espero ter ajudado...
T+
Nunca trabalhei com esta arquitetura em 3 camadas (ADO), uso dbExpress, mas o problema [b:bc127d5335]pode ser[/b:bc127d5335] na configuração do TClientDataSet...
A propriedade ´PacketRecords´ determina o número de registros que serão ´fetched´ para o cliente, o valor default eh ´-1´, ou seja, todos os registros, e isso em tabelas grandes é o caos... configure com o valor que achar adequado baseado nos seus testes (normalmente uso 1000), o fetch ocorrerá conforme necessário...
Espero ter ajudado...
T+
GOSTEI 0
Gmcouto
08/06/2004
Vinicius,
Tentei mudar essa propriedade, mas ele continua buscando todos os registros (30.000 no caso!).
É necessário configurar mais alguma coisa?
Li no help alguma coisa a respeito do evento ´BeforeGetRecords´ e deixa a entender que deveria utiliza-lo mas não diz como.
Obrigado pela atenção!
Guilherme
Tentei mudar essa propriedade, mas ele continua buscando todos os registros (30.000 no caso!).
É necessário configurar mais alguma coisa?
Li no help alguma coisa a respeito do evento ´BeforeGetRecords´ e deixa a entender que deveria utiliza-lo mas não diz como.
Obrigado pela atenção!
Guilherme
Colega,
Nunca trabalhei com esta arquitetura em 3 camadas (ADO), uso dbExpress, mas o problema [b:a2803af2c6]pode ser[/b:a2803af2c6] na configuração do TClientDataSet...
A propriedade ´PacketRecords´ determina o número de registros que serão ´fetched´ para o cliente, o valor default eh ´-1´, ou seja, todos os registros, e isso em tabelas grandes é o caos... configure com o valor que achar adequado baseado nos seus testes (normalmente uso 1000), o fetch ocorrerá conforme necessário...
Espero ter ajudado...
T+
GOSTEI 0
Vinicius2k
08/06/2004
Guilherme,
Você está correto... em 3 camadas é necessário informar ao Provider a partir de qual registro ele deve efetuar o fecth para o Client... esquecí-me disto...
A forma como uso é praticamente a mesma descrita no Help do Delphi... e é trabalhada no evento BeforeGetRecords do CDS desta forma:
Espero ter ajudado agora...
T+
Você está correto... em 3 camadas é necessário informar ao Provider a partir de qual registro ele deve efetuar o fecth para o Client... esquecí-me disto...
A forma como uso é praticamente a mesma descrita no Help do Delphi... e é trabalhada no evento BeforeGetRecords do CDS desta forma:
procedure TForm1.ClientDataSet1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); var UltimoValor: OleVariant; CDSTemp: ClientDataSet; begin if ClientDataSet1.Active then begin CDSTemp:= ClientDataSet.Create(Form1); try CDSTemp.CloneCursor(ClientDataSet1, True); CDSTemp.FetchOnDemand:= False; CDSTemp.Last; UltimoValor:= CDSTemp.Fields[0].AsString; CDSTemp.Close; finally CDSTemp.Free; end; end else UltimoValor:= null; OwnerData:= UltimoValor; end;
Espero ter ajudado agora...
T+
GOSTEI 0
Gmcouto
08/06/2004
Vinicus,
Essa foi a dificuldade que eu tive. Não precisa escrever nada nos eventos do TDataSetProvider?
[]s,
Guilherme
Essa foi a dificuldade que eu tive. Não precisa escrever nada nos eventos do TDataSetProvider?
[]s,
Guilherme
GOSTEI 0