![]() |
ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Ich habe meine Anwendung für den Zugriff auf MS-SQL-Datenbanken auf ADO (Express) umgestellt.
Jedoch ist mir folgendes Performance-Grab aufgefallen: Öffne ich nun mit obigen Einstellungen (clUseServer + ctKeySet) eine große Tabelle mittels SELECT * FROM <MeineTabelle>, so dauert es relativ lange (mehrere Sekunden). Die gleiche Abfrage über einen BDE + ODBC-Eintrag ergibt keine Verzögerung beim Öffnen der Query-Komponente. Alle anderen Einstellungen von CuserType (außer ctKeySet) sind nicht für eine Bindung an ein DB-Grid geeignet (Fehlermeldung, das Datenmenge keine Positionsmarken unterstützt). Irgendeine Idee welche Einstellungen performancemäßig gut sind und an ein DB-Grid gebunden werden können. |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Hallo Bernhard,
Zitat:
a) ab .net wird diese Art von Cursor nicht mehr unterstützt b) die Daten müssen früher oder später auf den Client übertragen, was spricht gegen ein clUseClient c) Andreas Kosch - Standardregel verwende bei MS Access clUseServer MS SQL clUseClient Zitat:
Macht meistens Schwierigkeiten Ausserdem ist es nicht gut eine grosse Tabelle in ein DataSet reinzuziehen (eben wegen Performence, etc) dafür gibt es eine WHERE-Clausel Oder Teile die Maske auf oben Grid zum browsen unten Eingabe oder Änderungen |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Zitat:
zu b, nicht unbedingt alle Daten. Nur soweit er Scrollen will (und muß). Wenn ich alle Daten am Client benötige (und nicht unbedingt ein Grid zu komplettanzeige benötige), so wird teilweise über einen Forward-Only-Curser/Client-Curser gearbeitet. zu c, Und wieso konnte man mit BDE Herrlich ohne große Performanceeinbußen Serverseitige Curser + Grid verwenden? Alles wird doch nicht immer besser Zitat:
Das Grid ist nur für die Anzeige und Selektion/Mehrfachselektion da. Alles andere wird mit optimierten SQL-Anweisungen durchgeführt. Deshalb auch keine Schwierigkeiten zu erwarten. [quote]Ausserdem ist es nicht gut eine grosse Tabelle in ein DataSet reinzuziehen (eben wegen Performence, etc) dafür gibt es eine WHERE-Clausel[quote] Nur bei ADO (und bei MySQL weil es dort keine Serverseitigen Curser gibt. Orale und ADS im Lokalbetieb funktionieren Problemlos. Die Where-Bedingung (welche auch verwendet wird) verringert zwar die Datenmenge, jedoch spech ich hier von bis zu 10.000.000 Mio. Datensätzen. Und wenn die Where-Anweisung immer noch 50.000 Datensätze übrig läßt... Und für andere "richtige" SQL-Datenbanken (Oracle) stellt das ja auch kein Problem da. |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Hallo,
Zitat:
Zitat:
b) und für eine Bindung an ein DB-Grid geeignet geschrieben jetzt doch nicht :?: Zitat:
Ich möchte nicht mehr mit der BDE auf meinen SQL-Server zugreifen. Da ist mir ADO mit all seinen Bugs lieber. Zitat:
Zitat:
Zitat:
eine WHERE-Klausel hat 50.000 Datensätze übrig läßt... in einem Grid hast du dir mal Gedanken gemacht wie lange ein Anwender braucht um 50000 Datensätze anzuschauen ? b) es gibt sicherlich Strategien wo ein serverseitiger Cursor einen clientseitigen vorzuziehen ist, aber wegen deiner Selektion/Mehrfachselektion würde ich mir ein anderes "Filter"-Konzept überlegen. c) den ADS mit einen klassischen SQL-Server vergleichen, ist bei der Menge an Daten vielleicht realisierbar aber fragwürdig |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Zitat:
Goldene Regel für alle Datenbanken: nur Tabellen mit Primary Key können problemlos in einem DBGrid angezeigt werden. Folgender View für den MS SQL Server zeigt dir alle Tabellen ohne PK an:
SQL-Code:
Mit PK gibt es keine Probleme mit clientside Cursor.
CREATE VIEW dbo.ViewNoPrimaryKeys
AS SELECT name FROM sysobjects WHERE id NOT IN (SELECT b.id FROM sysconstraints b, sysobjects c WHERE c.type = 'K' AND c.id = b.constid) AND type = 'U' |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
@trifid
Ich verwende generell serverseitige unidirektionale Cursor WANN IMMER ES GEHT! Weißt du auch warum? Es ist so ziemlich die schnellste Art Daten von einem DB-Server abzufragen. Die Zwischenschicht eines Client cursors klaut dir mindestens die Hälfte des möglichen Datendurchsatzes. Zitat:
Eine Suche nach "REF CUrsor" in der SDK Doku ergibt (Ranking 3): Zitat:
|
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Bei der BDE/ODBC-Kombination wird einfach ein "select * from MyTable" abgeschickt und über fetching werden nur die benötigten Daten abgerufen. Bei ADO wird mittles "exec sp_cursoropen @P1 output, N'select * from mat', @P2 output, @P3 output, @P4 output ..." ein Curser auf Server-Seite angelegt. Und wenn die Tabelle sehr groß ist, dauert das. Mir wäre ja geholfen, wenn ich ADO dahingehend bekomme, das Bookmarks (für Grid nötig) unterstützt werden, die Daten wenn möglich auf den Server bleiben und nicht per "exec sp_curseropen..." gearbeitet wird, sondern wie bei BDE/ODBC nur einfach die Query abgeschickt würde. |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
@Robert_G
Zitat:
a) es geht hier um Probleme mit MS-SQL-Server die Version kann hier 6.5, 7.0 oder 2000 sein oder die MSDE b) als ich von .NET sprach meinte ich ADO.Net c) habe ich etwas falsches gelesen im Buch A.Kosch Crashkurs .net für Delphianer Seite 275 Kapitel 6.3.3 "Keine serverseitige Cursor" d) sicherlich kann ein Cursor serverbasierender sein, wenn dieser auf den SQL-Server mittels in einer StoredProcedure ausgeführt wird das hat aber nichts mehr mit ADO zu tun @Bernhard Zitat:
OK, das ist eine lange Wartezeit Aber selbst wenn du nur 50000 Datensätze hast und 20Stück angezeigt werden sind das immer noch 2500x nachladen Dieses nachladen dauert länger insgesamt (auf die 2500x gesehen) länger wie auf einmal Zitat:
Sicherlich mit einen Cursor mit dem man nur vorwärtsblättern kann geht alles schneller, aber macht das auch der Anwender?, meistens will er wieder zurück scrollen um sich einfach zu vergewissern Zitat:
der Anwender ziemlich flux über die Datensätze und sucht nach Muster - und diese lassen sich halt nur mit WHERE's beschreiben Wenn der Anwender Zeit hat über 50000 Datensätze auf einmal zu gehen, dann hat er auch Zeit sich vorher Gedanken zu machen, nach was er überhaupt sucht! Meistens und leider sieht das der Anwender etwas anders ;-) Zitat:
b) in einer StoredProc "DECLARE cursor_name CURSOR GLOBAL" ... wichtig GLOBAL oder Doku mal anschauen DECLARE CURSOR mit Hilfe einer zweiten StoredProc die Daten fetchten, aber dann brauchst wahrscheinlich ein eigens dafür programmiertes Grid, welches das alles verwaltet bin mir aber nicht sicher ob das wirklich funktioniert Nochmals zu den SELECT * FROM Mat a) braucht der Anwender alle * Felder b) machmal ist ein ORDER BY eine grosse Hilfe für den Anwender c) besteht der PrimaryKey aus einen oder aus mehrere Feldern d) sicherlich hat die Tabelle noch SecundaryKey's, oder e) klingt komisch, aber hast du es mal über einen View probiert f) wird der Standard-Borland-DBGrid verwendet oder Third-Party schon mal mit dem TBetterADODataSet ![]() probiert ? |
Re: ADO (MS-SQL) + clUseServer + DBGrid-Anbindung
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ich werde noch 2 Möglichkeiten Ausprobieren: a, Verwendung von Forward-Curser + Eigenes-Caching und nicht DB-Gebundenes Grid b, Verwendung von Select TOP xyz .... order by "Primärschlüsselfelder" um definitiv nur maximal xyz-Datensätze anzuzeigen und für weitere Datensätze wird eine neue Query abgesendet, welche die Datensätze nach den schon vorhandenen liefert (ähnlich wie es ja auch im Internet bei Suchmachinen üblich ist Danke für alle Tips/Hinweise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz