Isso deixa a query lenta ?

Delphi

30/12/2004

pessoall,

qdo faco uma query , utilizo os seguintes comandos :

var str : string
begin
dm.qry.sql.text := ´´;

str := ´´;
str := ´select * from table where alguma coisa´;

dm.qry.close;
dm.qry.sql.add(str);
dm.qry.execsql;
dm.qry.open;
end;

Essas linhas podem deixar a query mais lenta para ser executada ?
O q é preferivel :
- definir o comando de select, insert, etc ... diretamente dentro da query (strings) , do que passar para uma varialve de depois jogar para query ?

Tem alguma propriedade da query q posso modificar e torna-la um pouco mais rapida ?

obr


Scandolara

Scandolara

Curtidas 0

Respostas

Weber

Weber

30/12/2004

Não faz diferença alguma mas você tem que se atentar a alguns detalhes:

var str : string 
begin 
  str := ´insert into table (.......) values (......)´; 

  dm.qry.close; 
  dm.qry.sql.Text := str; 
  dm.qry.execsql; //use execsql somente em insert, update, delete
end;


var str : string 
begin 
  str := ´select * from table where alguma coisa´; 

  dm.qry.close; 
  dm.qry.sql.Text(str); 
  dm.qry.open; //use open em select
end;


Faz a mesma coisa, só que com menos código. :D


GOSTEI 0
Edineidaniel

Edineidaniel

30/12/2004

Scandolara,

Sobre a passagem de um senteça SQL de uma variável, acho q naum influencia na performance do sistema.
O q vc deve tomar cuidado eh com a sentença SQL em si...
Use ao invés de *, use o nome dos campos que vc realmente necessita..

Ao meu ver eu naum vejo pq de usar uma variável para passar a sua sentença..

Coloque a sentença diretamente no no ADD..

Exemplo de como eu faço...
With DmManCR01.IBQryCce Do
Begin
Close;
SQL.Clear;
SQL.Add(´SELECT INTCODCCE, INTCODUSU ´);
SQL.Add(´FROM TBCADCCE ´);
SQL.Add(´ORDER BY INTCODCCE´);
Open;
End;

Ah vc naum precisar dar um ExecSQL e depois um Open, somente o Open resolve..

t+
Edinei


GOSTEI 0
Vinicius2k

Vinicius2k

30/12/2004

Colega,

Não há diferença para execução da Query a inserção da string SQL diretamente ou via código...
O que vc precisa é retirnar o método ExecSQL pois ele só deve ser utilizado em instruções de INSERT, UPDATE, DELETE e DDL... Para SELECT use apenas o método Open.
Também não é necessário inicializar a variável [b:32b60ba3a3]str[/b:32b60ba3a3] porque logo em seguida vc está atribuindo um valor a ela sem nenhum desvio condicional (IF ou CASE)...
...
var str : string
begin
  str := ´select * from table where alguma coisa´;
  with dm.qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add(str);
    Open;
  end;
end;


T+


GOSTEI 0
Shaolin

Shaolin

30/12/2004

Seguindo do exemplo do colega ´Vinicius2K´, se você retirar esta variavel da tua procedure ela pode ter mais utilidade. Coisa do Tipo:

public
{ Public declarations }
str: String;
procedure ExecutaSQL;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ExecutaSQL;
begin
with Query do
begin
Close;
SQL.Clear;
SQL.Add(str);
Prepare
Open;
end;
end;

Pois desta forma, você pode utilizar esta procedure para outras consultas, e não somente esta, por exemplo

procedure TForm1.Button1Click(Sender: TObject);
begin
str:= ´select nome from cadastro order by nome asc´;
ExecutaSQL;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
str:= ´select telefone, contato from agenda order by contato asc´;
ExecutaSQL;
end;


Espero ter ajudado.


GOSTEI 0
Weber

Weber

30/12/2004

Gostei da idéia.

  ...
  private
    function ExecutaQuery(const Text: String): Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.ExecutaQuery(const Text: String): Boolean;
begin
  try
    Query1.Close;
    Query1.SQL.Text := Trim(Text);
    if Copy(Trim(UpperCase(Text)),1,6) = ´SELECT´ then
      Query1.Open
    else
    begin
      if not Transaction1.InTransaction then
        Transaction1.StartTransaction;
      Query1.ExecSQL;
      Transaction1.CommitRetaining;
    end;
    Result := True;
  except
    if Copy(Trim(UpperCase(Text)),1,6) <> ´SELECT´ then
      Transaction1.RollbackRetaining;
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cText : String;
begin
  cText := ´Select * From Cadastro´;
  if ExecutaQuery(cText) then
    ShowMessage(´Executado com Sucesso!´)
  else
    ShowMessage(´Erro ao Executar!´);
end;

end.



GOSTEI 0
POSTAR