Einzelnen Beitrag anzeigen

Nuclear-Ping
(Gast)

n/a Beiträge
 
#10

Re: Umstieg von ALS auf Firebird -> Sehr langsam

  Alt 15. Apr 2008, 10:27
Zitat von mkinzler:
Gib doch genau mal im Admintool genau die abfrage an, welche du im Programm durchführst.
Versuch mal eine Neuindizierung.
1) Es sind vielleicht 1000 einzelne Abfragen, je nachdem wieviel Unter(-unter)knoten der gewählte Eintrag hat.
2) So?
SQL-Code:
SET TERM & ;
CREATE PROCEDURE REINDEX
AS
declare variable SQL VARCHAR(200);
BEGIN
  FOR
    select rdb$index_name from rdb$indices
    INTO :SQL
  DO
  BEGIN
    SQL='SET STATISTICS INDEX '||SQL||';';
    execute statement :sql;
  END
END &
SET TERM ; &

EXECUTE PROCEDURE REINDEX;
>Query OK, -1 rows affected (0,08 sec)
Wenn der mit -1 das Gesamtergebnis meint, hat das scheinbar nicht geklappt? Denn schneller finde ich's danach auch nicht.

Zitat von Bernhard Geyer:
Zitat von Nuclear-Ping:
1) Nicht dass ich wüßte. Wie mache ich sowas?
Delphi-Quellcode:
qry.text := 'SELECT * FROM DataDB WHERE CategoryID = :CategoryId';
qry.prepared := True;

<meine Schleife>
  qry.Close;
  qry.ParamByName('CategoryId').AsString := ...;
  qry.Open;
<meine Schleife>
Aber ADS ist schon gut schnell. Ob du hier viel mit Firebird Embedded gewinnst?
Aktuell bin ich auch auf der Suche nach einem DesktopDB-Ersatz für ADS Local Server.
Ja, den ALS hast du mir damals bei Spotlight (spectrumizer) empfohlen. Das war glaube vor 5-6 Jahren. War seit dem ersten Tag auch ziemlich zufrieden damit, nur nach der Zeit wollte ich mir auch mal was aktuelles anschauen.

Und grad hats wieder Klick gemacht, über ein Konzept was ich die ganze Zeit missverstanden hab. Ich habs die ganze Zeit (auch bei ADS) so gemacht:
Delphi-Quellcode:
<meine Prozedur>
  qry.text := 'SELECT * FROM ... WHERE CategoryId = :CategoryId';
  qry.Prepare;
  qry.Open;
    <fetch></fetch>
  qry.Close;
</meine Prozedur>

<meine Schleife>
  meine Prozedur
</meine Schleife>
Jaja ... Ich weiß ->

ZEOS hat in der Version allerdings kein Prepare / Prepared. Hab da aber mal kurz zum testen 'ne globale Boolean-Variable angelegt und den qry.Text-Teil darein gepackt, wenn sie nicht TRUE ist.
Delphi-Quellcode:
<meine Prozedur>
  if not QueryPrepared then
    begin
      qry.text := 'SELECT * FROM ... WHERE CategoryId = :CategoryId';
      QueryPrepared := TRUE;
    end;
  qry.ParamByName ('CategoryId') := CategoryId;
  qry.Open;
    <fetch></fetch>
  qry.Close;
</meine Prozedur>

QueryPrepared := FALSE;
<meine Schleife>
  meine Prozedur (CategoryId)
</meine Schleife>
Muss aber sagen, dass ich keinen Geschwindigkeitsunterschied feststelle.

(Ich hasse neue Systeme ...)
  Mit Zitat antworten Zitat