Announcement

Collapse
No announcement yet.

Performance von MSSQL-Server7.0

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

  • Performance von MSSQL-Server7.0

    Ich habe eine Frage zur Performance von MSSQL-Server7.0:
    Nach der Installation auf einem Server (NT4.0 SP6a, PentiumII 266 MHz, 128MB) und Aufbau einer Testappliaktion in Delphi5 mit Standardkomponenten (TDataBase,TTable,TDataSource,TDBGrid) kam die Ernüchterung:
    Der Befehl "Table.Active := True;" benötigte allein über 30 Sekunden !!! (bei ca 150.000 Datensätzen, bei 18.000 Datensätzen waren's immerhin noch
    knapp 10 Sekunden). Die Abarbeitung der Befehle "Table.First" und "Table.Last" benötigte etwa die gleiche Zeit.
    Der Datentransfer zwischen meiner Workstation und dem Server ist zwar erfreulich gering, es werden tatsächlich nur die im Grid angezeigten Datensätze übertragen, allerdings scheint auf dem Server einiges an Daten hin- und hertransferiert zu werden (bei jeder der Operationen Open,First,Last jeweils in der Größenordnung der gesamten Tabelle).
    Ich habe mit verschiedenen Indizes herumexperimentiert, die SQL-Abfragen an den Server berücksichtigen in ihrem "ORDER BY"- Statement die Indexfelder auch sauber, schneller wird's dadurch aber auch nicht.
    Ich wäre sehr dankbar, wenn jemand hier eine Lösung wüßte (Vielleicht eine Änderung in der Konfiguration des MSSQL-Servers...).

    [email protected]

  • #2
    Hallo,

    dies Problem hat primär nichts mit dem SQL Server 7 zu tun sondern betrifft alle SQL-Datenbanken. Da ein SQL-Server nur Anweisungen in Form von SQL entgegennimmt, muss TTable hinter den Kulissen alle Benutzeraktionen in SQL übersetzen und zum Server schicken. Beim Öffnen einer TTable, bei der <b>kein</b> Filter gesetzt wird, schickt TTable die Anweisung "SELECT x,y,z FROM Tabelle ORDER BY x" zur Datenbank. Bei 150 000 Datensätzen muss der SQL-Server die ganze Ergebnismenge zusammenstellen und sortieren, auch wenn TTable so klever ist und nur die im TDBGrid sichtbare Anzahl der Datensätze abfordert.

    Um das Problem zu lösen, gibt es mindestens 2 Alternativen:

    1. TTable.Filter schränkt die Datenmenge ein, dabei setzt TTable ein Filter in die Anweisung "SELECT x,y,z FROM Tabelle WHERE x = Filterwert" um, so das die WHERE-Klausel dafür sorgt, das der SQL Server nicht alle 150 000 Datensätze aufbauen und sortieren muss. Je selektiver das Filterkriterium ist, umso besser. Bleiben dann nur wenige Datensätze überig, ist auch First und Last kein Problem. Kein Benutzer kann tatsächlich mit 150 000 Datensätzen am Stück effektiv arbeitet - welchen Sinn soll es haben, alle Datensätze auf einmal zum "Browsen" anzubieten.

    2. Man setzt TQuery ein und optimiert die SELECT-Abfrage von Hand, so das nur die Datensätze in der Ergebnismenge sind, die der Benutzer momentan auch tatsächlich benötigt. Allerdings sollte man bei TQuery im Gegensatz zu TTable <b>nicht</b> auf ein Filter zurückgreifen, so TQuery lokal filtert (d.h. zuerst werden alle Datensätze zum Client transportiert).

    P.S: SQL-Datenbanken arbeiten mengenorientiert und müssen sich daher grundlegend von den datensatzorientierten ISAM-Datenbanken wie ACCESS, dBASE oder Paradox unterscheiden.

    &#10

    Comment

    Working...
    X