Announcement

Collapse
No announcement yet.

BDE - MS SQLSRV

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

  • BDE - MS SQLSRV

    Hallo

    Umgebung: Delphi 5.0 Enterprise, MS SQLSRV 7.0
    (gilt auch für D3, D4 und MSSQLSRV 6.5)

    Folgendes Problem:
    Das öffnen einer TQuery (Select * From Tabelle (100000 Datensätze)) ist dank BDE sehr schnell. Erst beim Scrollen wird nachgeladen. Öffnet man eine zweite TQuery (andere Tabelle!!) auf der selben TDatabase, wird die erste voll geladen (100000 DS!!). Nur wenn eine andere TDatabase verwendet wird, kann das volle Laden der ersten TQuery verhindert werden.

    Gibt es dagegen eine Abhilfe?

  • #2
    Hallo,

    dieses Problem hat nichts mit dem SQL-Server und auch nicht direkt etwas mit Delphi zu tun, sondern ist eine Folge des Wirkungsprinzips der SQL-Datenbanken. Im DER ENTWICKER Ausgabe 1/99 habe ich für die Erklärung der Zusammenhänge 2 Heftseiten benötigt - hier im Forum steht nicht so viel Platz zur Verfügung.

    Die BDE kann sich den "Luxus" erlauben, nur die sichtbaren Daten einer Ergebnismenge sofort zur laden - denn bei Bedarf kann jederzeit der Rest aus der Ergebnismenge des SQL-Servers nachgeladen werden. Allerdings ist die "Lebensdauer" der Ergebnismenge beschränkt, bei einem Ende der eigenen Transaktion wird die Ergebnismenge in der Regel verworfen (solange man keine Vorkehrungen dagegen trifft, wenn es überhaupt Server-spezifische Möglichkeiten dazu gibt). Wenn das passiert, versucht die BDE die Ergebnismenge "zu retten", indem alle Datensätze zum Client kopiert werden.

    Somit gibt es praktisch nur 2 Alternativen: <br>
    1. Transaktion offen halten bzw. getrennte Transaktionen(hat aber Nebenwirkungen) <br>
    2. Ergebnismenge durch eine WHERE-Einschränkung klein halten. <br>
    Nur die 2. Alternative kann uneingeschränkt empfohlen werden, denn in diesem Fall hat das "Retten" durch Nachladen aller Datensätze keine Beeinträchtigung durch Wartezeiten zur Folge.

    P.S: Beim InterBase-Server hat man die Wahl zwischen einem <b>Hard Commit</b> und einem <b>Soft Commit</b> und kann damit das Problem etwas umgehen. <br>
    Die zweite TDatabase-Instanz öffnet eine zweite Datenbank-Sitzung, so das auch die Transaktionen unabhängig davon ablaufen

    Comment

    Working...
    X