Entwickler-Ecke
Datenbanken - MS SQL Server, was passiert beim Öffnen einer Tabelle?
ibh_compucat - Mi 03.03.10 17:21
Titel: MS SQL Server, was passiert beim Öffnen einer Tabelle?
Hallo,
ich greife aus meinem Programm auf Tabellen eines MS SQL-Servers zu. Dazu öffne ich im Form1.create die entsprechenden Tabellen (z.B. Form1.Tabelle1.open), so daß ich später an den Stellen, an denen ich sie brauche z.B. unmittelbar lesen kann.
Nach nunmehr einigen Jahren sind die Tabellen teilweise auf ca. 100 MB angewachsen (das ist ja eigentlich nicht viel) und der Öffnungsprozess (Zeitraum vom Starten des Icons bis zum Erscheinen der Form) dauert inzwischen bis zu 50 Sekunden in einem schnellen Gigabyte LAN.
Das Ganze soll nun auch noch über DSL passieren, dabei entstehen für die Anmeldung bei der Datenbank Zeiten von ca. 40 Minuten, das ist nicht akzeptabel.
Offensichtlich hängt die Öffnungsdauer von der Größe der Tabelle einer Datenbank ab, dabei möchte ich an dieser Stelle überhaupt keine Inhalte wissen, sondern nur die Verbindung mit der Datenbank herstellen und "als Freund behandelt werden".
Wenn ich statt Tabelle.open sage Tabelle.Active ist das kein sichtlicher (zeitlicher) Unterschied.
Steht die Verbindung, dann ist der weitere Zugriff akzeptabel.
Kann mir jemand einen Hinweis geben, wie man einen zügigen Zugriff auf einen SQL-Server (über DSL, ca. 4000) herstellen kann?
freundliche Grüsse
ibh_compucat
bummi - Mi 03.03.10 17:47
AdoConnection.Connected := true;
oder
Select * from tabelle where 1=0
ibh_compucat - Mi 03.03.10 18:25
Hallo Thomas,
Danke für den Hinweis, kann ich leider erst morgen testen.
Gruß ibh_compucat
ibh_compucat - Do 04.03.10 12:33
klappt leider noch nicht. Wenn ich mit Form1.ADOConnection1.connected die Verbindung herstelle kommt zwar keine Fehlermeldung, aber die Tabellen sind noch nicht für Zugriffe geöffnet, d.h. ich muß die Tabelle vor einem Zugriff mit ADOTable1.open oder mit ADOTable1.Active = True öffnen und habe dann das Zeitproblem, daß offensichtlich alle Daten der Tabelle vom SQL-Server an den Client übertragen werden, obwohl ich vielleicht nur einen Datensatz anhängen will.
Aufgrund des Schnittstellenmonitors und der angegebenen Transferrate habe ich die ausgetauschte Datenmenge beim Öffnen der Tabelle überschlagen und das stimmt in etwa mit der Datenmenge der gesamten Tabelle überein.
Bei der ADOQuery kann ich mit einer WHERE Klausel, die nicht erfüllt werden kann, den Datentransfer minimieren, aber wie mache ich das bei einer ADOTable?
Hat jemand eine Idee?
freundliche Grüße ibh_compucat
Robert.Wachtel - Do 04.03.10 14:52
ibh_compucat hat folgendes geschrieben : |
[...] wie mache ich das bei einer ADOTable? [...] |
Gar nicht.
Man benutzt die ADOTable-Komponenten nicht. Diese sind eigentlich nur für die vereinfachte Migration von BDE-basierten Applikationen eingeführt worden und haben genau den von Dir beobachteten Nachteil.
ibh_compucat - Do 04.03.10 15:21
Danke Robert,
das ist ein klares Wort, ich werden die Tabellen durch Querys ersetzen ('ne Menge Arbeit).
Nochmals herzlichen Dank
ibh_compucat
bummi - Do 04.03.10 19:44
Nimm direkt die Adodatasets, hier sind die Möglichkeiten am unbeschränktesten
ibh_compucat - Fr 05.03.10 10:36
Ich habe inzwischen die Tables durch Querys ersetzt, da mir beide vertraut waren und es war weniger Arbeit als ich befürchtet hatte.
Die ADODatasets hatte ich bis heute noch gar nicht wahrgenommen bzw. wusste nichts damit anzufangen. Aber ich habe sie natürlich jetzt gefunden und ich werde mich damit vertraut machen.
Danke an Dich, Thomas.
Gruss ibh_compucat
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!