Announcement

Collapse
No announcement yet.

TTable - Performance

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TTable - Performance

    Hallo!

    Um einen Datensatz einer TTable zu bearbeiten muss diese dazu geöffnet werden. Das kann aber bei sehr grossen Datenmengen recht lange dauern (es wird dem SQL-Befehl immer ein ORDER BY angehängt).

    1. Kann man das ORDER BY unterdrücken? (Ein Clustered Index würde dies verbessern, allerdings hat dies wieder andere Nachteile)

    2. Kann man (ohne zu filtern!!!) mit einer TTable nur einen bestimmten Datensatz zur Bearbeitung laden? (Die Antwort wäre Preisverdächtig)

    Ciao
    Herbert

  • #2
    Hallo,

    welche Datenbank wird denn verwendet? Wenn es sich um einen SQL-Server handelt, reicht das Aktivieren eines <b>Filters</b> aus, um TTable dazu zu bringen, automatisch eine WHERE-Bedingung in die SELECT-Anweisung aufzunehmen. Wird nach dem Primärschlüsselwert gefiltert, enthält die TTable-Datenmenge (auf dem Server) nur einen einzigen Datensatz. Mit einer InterBase-Datenbank kann das jederzeit im <b>SQL-Monitor</b> nachgeprüft werden. Eine TTable setzt einen Filter in eine WHERE-Bedingung um, während im Gegensatz dazu TQuery immer lokal filtert (d.h. bei TQuery baut der SQL-Server die vollständige Datenmenge auf, die zum Client transportiert und erst dort "gefiltert" wird).

    In dem folgenden Beispiel wird eine Datensatz über ein zweites Auswahlformular (das TQuery verwendet) ausgewählt und dann im Hauptformular über TTable zur Bearbeitung geöffnet. Da als Filterkriterium der Primärschlüssel der Tabelle verwendet wird, enthält TTable immer nur <b>einen einzigen Datensatz</b>:
    <pre>
    procedure TFormMain.ToolButtonEditClick(Sender: TObject);
    var
    sFilter : String;
    begin
    Table1.Filtered := False;
    Table1.Filter := '';
    Table1.Active := False;
    FormEdit := TFormEdit.Create(self);
    try
    FormEdit.ShowModal;
    finally
    FormEdit.Release;
    end;
    sFilter := 'EMP_NO=' + IntToStr(FEMP_NO);
    Table1.Filter := sFilter;
    Table1.Filtered := True;
    Table1.Active := True;
    StatusBar1.SimpleText := Format('TTable-Filterkriterium: %s', [sFilter]);
    end;
    </pre>
    Im SQL-Monitor wird sichtbar, das TTable automatisch beim Filtern die folgende SELECT-Anweisung generiert:
    <pre>
    SELECT EMP_NO ,FIRST_NAME ,LAST_NAME ,PHONE_EXT ,HIRE_DATE ,
    DEPT_NO ,JOB_CODE ,JOB_GRADE ,JOB_COUNTRY ,SALARY ,FULL_NAME
    FROM EMPLOYEE
    WHERE (EMP_NO = ?)
    ORDER BY EMP_NO ASC
    </pre>
    Der SQL-Platzhalter "?" wird vor dem Aufruf durch den aktuellen Primärschlüsselwert ersetzt. Und da der SQL-Server bei der Suche nach dem Primärschlüsselwert (der garantiert eindeutig ist) immer nur einen Datensatz in der Ergebnismenge aufbauen kann, wird auch das ORDER BY vom SQL-Server völlig ignoriert. Man muss es also gar nicht selbst unterdrücken.

    P.S: Eine umfangreichere Zusammenstellung der Unterschiede zwischen TQuery und TTable sowie eine Aufstellung der jeweiligen Einsatzfälle findet sich in meinem Buch <b>Client/Server Datenbankentwicklung mit Delphi</b>.
    &#10

    Comment


    • #3
      Hallo,

      hört sich nicht schlecht an.
      Ich verwende MS SQL-Server aber auch MS Access.

      1. Wie verhält sich TTable bei Access?

      2. Wenn nur ein Datensatz eingefügt werden soll, kann ich kein Filter setzen. Das Problem ist wieder da!

      3. Ich bin am überlegen alles auf ADO umzustellen. Würde ich die selben Probleme haben?

      P.S: Habe doch schon alle 3 Bücher bestellt, aber noch nicht erhalten

      Comment


      • #4
        Hallo,

        zu Frage 1: <br>
        Eine ACCESS-Datenbank gehört zur Kategorie der ISAM-Datenbanken und arbeitet datensatzorientiert, nicht mengenorientiert. Somit ist SQL immer ein "Fremdkörper", der in die nativen Funktionen umgesetzt werden muss. Daher ist TTable bei ISAM-Datenbanken in den meisten Fällen geeigneter als TQuery (TQuery macht nur dann Sinn, wenn Informationen aus verschiedenen Tabellen über einen Join zusammengestellt werden sollen). Bei SQL-Datenbanken hat je nach Aufgabe sowohl TStoredProc, TQuery als auch TTable die Nase vorn.

        zu Frage 2: <br>
        Zum Einfügen eines völlig neuen Datensatzes (ohne die Anzeige aktualisieren zu müssen) ist TTable weniger geeignet, hier reicht TQuery mit einer INSERT-Anweisung völlig aus. Die TQuery sollte jedoch nicht als "lebende Datenmenge" (RequestLive) betrieben werden (also kein SELECT, und dann neuen Datensatz einfügen). Wer das macht, hat mit TQuery keine Vorteile gegenüber TTable.

        zu Frage 3: <br>
        Ja - denn bei einer Client/Server-Datenbankanwendung bestimmt der SQL-Server die Regeln, der Zugriffsweg (API; ODBC; SQL-Links; ADO) ist völlig nebensächlich. Wenn auf die Version 7 des MS SQL Server bzw. auf ACCESS 2000-Datenbanken zugegriffen werden soll, ist ADO auf jeden Fall sinnvoll

        Comment

        Working...
        X