Aumentar Velocidade de Consulta

Delphi

05/06/2006

Alguem tem uma solução para aumentar a velocidade dessa consulta, vou passar o codigo abaixo, é o seguinte eu tenho uma tabela de veiculo onde esta cadastrado os veiculos dai faço um consulta que retorna veiculo por veiculo e em cada veiculo ele consulta 96 registros no dia pois cada um desses 96 representa 15 min, mais qdo faço essa busca que me exibe todos os veiculos demora muito, gostaria de uma jeito de agilizar essa consulta, pois preencho um DBGRID onde cada linha é um veiculo e cada coluna é um intervalo de 15 min, entenderam?? o codigo está abaixo



var dt:Tdate;
x,cont:integer;
begin
dt:=DateEdit1.Date;
cont:=0;
dtmodulo.qr_listavei.Open;
dtmodulo.qr_listavei.First;
while not dtmodulo.qr_listavei.Eof do
begin
dtmodulo.dts_viagem.close;
dtmodulo.dts_viagem.ParamByName(´VCODIGO´).AsString:= dtmodulo.qr_listavei.fieldbyname(´CAM_PLACA´).AsString;
dtmodulo.dts_viagem.ParamByName(´VCODIGOS´).AsDate:=dt;
dtmodulo.dts_viagem.Open;
ProfGrid1[0,cont].Value:=dtmodulo.qr_listavei.fieldbyname(´CAM_DESCRICAO´).AsString;
for x:=1 to 96 do
begin
dtmodulo.dts_diario.Close;
dtmodulo.dts_diario.ParamByName(´VCODIGO´).AsString:= dtmodulo.dts_viagem.Fieldbyname(´CAM_Placa´).AsString;
dtmodulo.dts_diario.ParamByName(´VCODIGOS´).AsDate:= dtmodulo.dts_viagem.Fieldbyname(´Via_Data´).AsDateTime;
dtmodulo.dts_diario.ParamByName(´VCODIGOSS´).AsInteger:=x;
dtmodulo.dts_diario.open;
qr_auxiliar.Close;
qr_auxiliar.SQL.Clear;
qr_auxiliar.SQL.Add(´Select STA_COR, STA_CODIGO from Status where STA_CODIGO = ´+QuotedStr(dtmodulo.dts_diarioSTA_CODIGO.AsString));
qr_auxiliar.Open;
if dtmodulo.dts_diarioDIA_SIN.Value=´S´ then ProfGrid1.cells[x,cont].Value:=´|´ else ProfGrid1.Cells[x,cont].value:=´´;
ProfGrid1[x,cont].Color:=qr_auxiliar.fieldbyname(´STA_COR´).Value;
end;
inc(cont);
dtmodulo.qr_listavei.Next;
end;
end;


Hacknux

Hacknux

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

05/06/2006

Vc está usando qual banco de dados? Está usando índices nos campos usados como critério?


GOSTEI 0
Hacknux

Hacknux

05/06/2006

Estou usando o Firebird e o indice são apenas as chaves primarias e estrangeiras e ai estou apenas fazendo busca usando as chaves primarias e estrangeira, na Tabela Veiculo é a Placa, na Diario, é a Placa, a Data e o Codigo que é sempre de 1 a 96


GOSTEI 0
Minuto

Minuto

05/06/2006

car via codigo vai ficar lento mesmo tenta criar viws e procedures pra resumir isso

se vc quiser posta ai as tabelas (os creates) e como vc quer q funcione q posso tentar fazer pra vc!

melhor ainda c vc tiver como mandar um banco com tabelas e registro

terei o maior prazer em ajudar ! ( adoro procedures com firebird rs) :wink:

minutacio@bol.com.br


GOSTEI 0
Hacknux

Hacknux

05/06/2006

Segue a Estrutura do Banco usada nessa pesquisa, se quizer mando o Banco, com alguns registro só passar um e-mail ou MSN

SET SQL DIALECT 3;
SET NAMES WIN1252;
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE TABLE MOTORISTA (
MOT_CODIGO INTEGER NOT NULL,
MOT_NOME VARCHAR(60)
);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE MOTORISTA ADD CONSTRAINT PK_MOTORISTA PRIMARY KEY (MOT_CODIGO);


SET SQL DIALECT 3;
SET NAMES WIN1252;
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE TABLE CAMINHAO (
CAM_PLACA VARCHAR(7) NOT NULL,
CAM_DESCRICAO VARCHAR(25),
MOT_CODIGO INTEGER,
CAM_UNIDADE VARCHAR(50),
CAM_TIPO VARCHAR(30),
CAM_COMPA VARCHAR(30)
);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE CAMINHAO ADD CONSTRAINT PK_CAMINHAO PRIMARY KEY (CAM_PLACA);
/******************************************************************************/
/**** Foreign Keys ****/
/******************************************************************************/
ALTER TABLE CAMINHAO ADD CONSTRAINT FK_CAMINHAO_1 FOREIGN KEY (MOT_CODIGO) REFERENCES MOTORISTA (MOT_CODIGO) ON UPDATE CASCADE;


SET SQL DIALECT 3;
SET NAMES WIN1252;
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE TABLE VIAGEM (
VIA_DATA DATE NOT NULL,
CAM_PLACA VARCHAR(7) NOT NULL,
VIA_ATUALIZACAO TIMESTAMP
);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE VIAGEM ADD CONSTRAINT PK_VIAGEM PRIMARY KEY (VIA_DATA, CAM_PLACA);
/******************************************************************************/
/**** Foreign Keys ****/
/******************************************************************************/
ALTER TABLE VIAGEM ADD CONSTRAINT FK_VIAGEM_1 FOREIGN KEY (CAM_PLACA) REFERENCES CAMINHAO (CAM_PLACA) ON UPDATE CASCADE;


SET SQL DIALECT 3;
SET NAMES WIN1252;
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE TABLE DIARIO (
VIA_DATA DATE NOT NULL,
CAM_PLACA VARCHAR(7) NOT NULL,
DIA_HORA INTEGER NOT NULL,
MOT_CODIGO INTEGER,
STA_CODIGO VARCHAR(2),
DIA_OBS VARCHAR(600),
DIA_SIN VARCHAR(1)
);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE DIARIO ADD CONSTRAINT PK_DIARIO PRIMARY KEY (VIA_DATA, CAM_PLACA, DIA_HORA);
/******************************************************************************/
/**** Foreign Keys ****/
/******************************************************************************/
ALTER TABLE DIARIO ADD CONSTRAINT FK_DIARIO_1 FOREIGN KEY (VIA_DATA, CAM_PLACA) REFERENCES VIAGEM (VIA_DATA, CAM_PLACA) ON UPDATE CASCADE;
ALTER TABLE DIARIO ADD CONSTRAINT FK_DIARIO_2 FOREIGN KEY (MOT_CODIGO) REFERENCES MOTORISTA (MOT_CODIGO) ON UPDATE CASCADE;
ALTER TABLE DIARIO ADD CONSTRAINT FK_DIARIO_3 FOREIGN KEY (STA_CODIGO) REFERENCES STATUS (STA_CODIGO) ON UPDATE CASCADE;


GOSTEI 0
Minuto

Minuto

05/06/2006

Como vc não passou a forma que vc quer essa pesquisa to tentando descobrir no seu codigo mas mesmo assim ta dificil, veja as duvidas abaixo:

dtmodulo.qr_listavei.Open; // 1ª TABELA VEICULOS?
dtmodulo.qr_listavei.First;
while not dtmodulo.qr_listavei.Eof do
begin


dtmodulo.dts_viagem.close;
dtmodulo.dts_viagem.ParamByName(´VCODIGO´).AsString:= dtmodulo.qr_listavei.fieldbyname(´CAM_PLACA´).AsString;
dtmodulo.dts_viagem.ParamByName(´VCODIGOS´).AsDate:=dt;
dtmodulo.dts_viagem.Open;
ProfGrid1[0,cont].Value:=dtmodulo.qr_listavei.fieldbyname(´CAM_DESCRICAO´).AsString;


for x:=1 to 96 do
begin
dtmodulo.dts_diario.Close;
dtmodulo.dts_diario.ParamByName(´VCODIGO´).AsString:= dtmodulo.dts_viagem.Fieldbyname(´CAM_Placa´).AsString;
dtmodulo.dts_diario.ParamByName(´VCODIGOS´).AsDate:= dtmodulo.dts_viagem.Fieldbyname(´Via_Data´).AsDateTime;
dtmodulo.dts_diario.ParamByName(´VCODIGOSS´).AsInteger:=x;

ESSE X AI QUAL É O CAMPO NA TABELA COM PARAMETRO ´VCODIGOSS´?


MEU EMAIL : MINUTACIO@BOL.COM.BR


GOSTEI 0
Minuto

Minuto

05/06/2006

Eu criei essa view da uma olhada v se isso não simplifica um pouco as coisas:

é claro que como eu não sei o q vc precisa ai de campos das tabelas eu fiz so pra teste mesmo vc pode depois adicionar + campos

vc sabe usar view né?

create view PESQUISA (via_data,cam_placa,dia_hora,mot_codigo,sta_codigo
,dia_sin,via_atualizacao,mot_codigo )
as
select DIARIO.via_data,DIARIO.cam_placa,DIARIO.dia_hora,DIARIO.mot_codigo,DIARIO.sta_codigo
,DIARIO.dia_sin , VIAGEM.via_atualizacao ,CAMINHAO.cam_descricao,CAMINHAO.mot_codigo FROM DIARIO
INNER JOIN VIAGEM ON VIAGEM.cam_placa = DIARIO.cam_placa AND VIAGEM.via_data
=DIARIO.via_data
inner JOIN CAMINHAO ON CAMINHAO.cam_placa =DIARIO.cam_placa


GOSTEI 0
Minuto

Minuto

05/06/2006

Eu criei essa view da uma olhada v se isso não simplifica um pouco as coisas: é claro que como eu não sei o q vc precisa ai de campos das tabelas eu fiz so pra teste mesmo vc pode depois adicionar + campos vc sabe usar view né? create view PESQUISA (via_data,cam_placa,dia_hora,mot_codigo,sta_codigo ,dia_sin,via_atualizacao,mot_codigo ) as select DIARIO.via_data,DIARIO.cam_placa,DIARIO.dia_hora,DIARIO.mot_codigo,DIARIO.sta_codigo ,DIARIO.dia_sin , VIAGEM.via_atualizacao ,CAMINHAO.cam_descricao,CAMINHAO.mot_codigo FROM DIARIO INNER JOIN VIAGEM ON VIAGEM.cam_placa = DIARIO.cam_placa AND VIAGEM.via_data =DIARIO.via_data inner JOIN CAMINHAO ON CAMINHAO.cam_placa =DIARIO.cam_placa


create view PESQUISA (via_data,cam_placa,dia_hora,mot_codigo,sta_codigo
,dia_sin,via_atualizacao,cam_descricao )
as
select DIARIO.via_data,DIARIO.cam_placa,DIARIO.dia_hora,DIARIO.mot_codigo,DIARIO.sta_codigo
,DIARIO.dia_sin , VIAGEM.via_atualizacao ,CAMINHAO.cam_descricao FROM DIARIO
INNER JOIN VIAGEM ON VIAGEM.cam_placa = DIARIO.cam_placa AND VIAGEM.via_data
=DIARIO.via_data
inner JOIN CAMINHAO ON CAMINHAO.cam_placa =DIARIO.cam_placa


GOSTEI 0
Hacknux

Hacknux

05/06/2006

Entao essa VIEW resume bem alguns dos problemas, mais o que mais deixa lento é que cada CAMINHAO eu tenho que ler 96 linhas e jogar isso em 96 colunas do DBGRIG, o que deixa muito lento, pois faço o select por cada veiculo em uma data e ele retorna 96 linhas e essas linhas tenho que fazer elas virarem colunas pra por no GRID, onde cada coluna é um espaço de tempo de 15 min e cada linha é um veiculo, entendeu o que eu faço, o q eu acho que ia resolver é se eu conseguisse fazer tipo uma transposta um SQL que pega-se as 96 linhas e fizese elas virarem colunas dai acho que já dava um melhora-da ou será que tenha outra solução se quizer eu mando o programa com a base pra vcs darem uma olhada, só passar o e-mail.


Desde já agradeço a atenção.


GOSTEI 0
Minuto

Minuto

05/06/2006

agora saquei ...

eu ja tive esse tipo de relatorio q vc tem 96 registros em linhas e tem q passar pra colunas.

tem 2 meios pra resolver isso :

criar uma tabela temporaria no banco com 96 colunas e toda vez q vc for fazer a consulta c da um delete * from table

ou

(essa q eu uso)
eu uso RXlib (conhece?) ele tem um componente chamado rxmemorydata q cria uma tabela virtual .

vc pode criar os campos em tempo de projeto no delphi:

for i:=1 to (query.recordcount) do
begin
memo.FieldDefs.Add(´campo´+inttostr(i),ftinteger,false);
...

da uma pesquisada muita gente usa esse componente


GOSTEI 0
POSTAR