Abfragen einer bereits vorhandenen ADODB-recordset im Arbeitsspeicher, der Verwendung von filtern und Aggregat-Funktionen (advanced ADODB-Bibliothek?)
Habe ich einige bestehende code, der die Abfrage auf eine SQL-Datenbank immer wieder mit verschiedenen Parametern und ich dachte, es wäre wahrscheinlich besser, wenn ich es geändert wählen Sie einen großen Teil der Daten in ein ADODB.Recordset an den start, und dann innerhalb der Schleife der Abfrage dieses recordset eher als die Datenbank selbst.
Eine weitere Einschränkung ist, dass ich Aggregatfunktionen (SUM,MIN,MAX,AVG), wenn ich die Ausführung dieser sub-queries.
Codierung wäre das nicht auch furchtbar schwierig, aber etwas, das offensichtlich scheint, wie es gewesen wäre, getan Tausende Male vorher, so dass ich mich Frage, ob es eventuell ein open-source-Bibliothek von einer Art gibt, enthält diese Art von Funktionalität? Ich schwöre, ich traf ein paar Jahre zurück, aber bin nicht in der Lage zu verfolgen es auf google.
EDIT:
Ein guter Vorschlag (von TimW) in den Kommentaren war, alles zu tun, die aggregation auf dem Datenbank-server und zurück an den client übergeben, und dann nur die Filterung auf dem client.
(Obwohl, in diesem Fall funktioniert es nicht, da 2 von den Spalten mit der Filterung angewendet werden DateTime-Spalten)
UPDATE
Hier ist die Bibliothek, die ich bisher gestoßen:
http://code.google.com/p/ado-dataset-tools/
Nicht sicher, ob der Autor aufgegeben hat oder nicht (sein plan schien zu sein, Sie zu aktualisieren und zu konvertieren c#), aber die VBA-Versionen der einzelnen Bibliotheken scheinen hier erhältlich:
http://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls?spec=svn8&r=8#ado-recordset-unit-tests.xls
Spezifische ADO-Bibliothek, die ich war daran interessiert, ist hier:
http://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls/SharedRecordSet.bas
Sehen, speziell die GroupRecordSet() Funktion.
Nur SUM,MIN,MAX-Aggregat-Funktionen scheinen unterstützt zu werden.
Eine andere mögliche alternative (wenn Sie innerhalb von Excel)
Schreiben von SQL-Abfragen in Virtuellen Tabellen im Excel-VBA -
http://www.vbaexpress.com/forum/showthread.php?t=260
Nicht sicher, wie Sie dies durchführen würde, sondern ziehen die raw-Daten (mit teilweise pre-aggregation) in einem lokalen Arbeitsblatt in Excel, und verwenden Sie dann das Arbeitsblatt als Datenquelle in nachfolgenden Abfragen könnte eine sinnvolle option sein.
- Jemand könnte haben einen benutzerdefinierten Anbieter verwenden kann, ein Recordset als Datenquelle und akzeptieren und verarbeiten von SQL-gegen ihn, aber ich glaube nicht, dass ich jemals einen gesehen.
- Könntest du vielleicht ändern die Weise, die Sie ausführen Ihre sub-queries zu tun, als eine große Abfrage? Eg:
select Min(t.blah), Max(t.blah) ... where t.key in(1,2,3,4)
eher als ein buch von separatenselect Min(t.blah), Max(t.blah) ... where t.key=1
-Typ Abfragen. - das ist ein ausgezeichneter Vorschlag, danke....so kann ich noch tun, client-side-Filter, aber lassen Sie die sql server-pre-Aggregat alles.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine eigene Erfahrung ist, dass es eigentlich weit mehr effizient, um viele kleine Aufrufe der Datenbank, als es zum laden großer Mengen von Daten in einem recordset, und versuchen Sie dann zu filter/Abfrage von Daten.
Ich bin auch unter dem Eindruck, dass Ihre Fähigkeit, filter/Abfragen von Daten in einer bestehenden ADO-recordset ist ziemlich begrenzt im Vergleich zu was einzelne Aufrufe der Datenbank. Damals, als ich versuchte, dies zu tun ich dachte, es sollte so einfach wie das erstellen einer zweiten ADO-recordset über die Abfrage der ersten Verwendung von SQL. Ich habe nie einen Weg finden, das zu tun; ich bin mir ziemlich sicher, dass es nicht möglich ist.
Edit1
Zu helfen, Sie verstehen den Unterschied, ich schrieb einige code, Lesen Sie im neuen Preis-Daten aus einer text-Datei und aktualisiert die Preise in einer Visual Foxpro-Datenbank mithilfe von ADO und VFP OLE-Treiber. Die Tabelle die ich Abfragen hatte etwa 650.000 Datensätze. Ich dachte, es wäre am besten, Sie laden alle Datensätze in einem recordset und dann verwenden Sie ADO-filter-Methode. Als ich dies Tat es nahm mir den code drei bis vier Stunden zu laufen. Ich habe meinen code gerade schauen Sie oben jedes Datensatzes, ein zu einer Zeit, und mein code lief dann in einer minute und zwei Sekunden. Ich geschrieben über dieses problem auf ALSO. Sie können werfen Sie einen Blick auf die verschiedenen Antworten, die ich erhielt: Beschleunigen Sie das Suchen/Filter-Operation - (VB6, Textdatei, ADO, VFP 6.0-Datenbank)
Wenn Ihr performance-Problem ergibt sich aus einer remote-SQL-Server-Datenbank über eine langsame Verbindung dann lokal Zwischenspeichern könnte einen gewissen Sinn, wenn Sie mit den Daten arbeiten intensiv.
Einen Weg, um eine Menge Vielseitigkeit ist, sich eine lokale Jet-MDB, wie Sie Ihren cache.
Könnte man die Initiale "caching" - Abfrage mit Jet zu tun, WÄHLEN Sie eine von Ihrem externen SQL Server-Datenbank IN einer lokalen Tabelle, dann ERSTELLEN Sie Indizes auf. Von dort aus könnten Sie führen Sie eine beliebige Anzahl von nachfolgenden Abfragen in der lokalen Tabelle ist. Wenn Sie brauchen, um die Arbeit mit anderen Untergruppe legen Sie einfach die lokale Tabelle und die Indizes, und requery der remote-Datenbank.
Aber wenn Sie Ihre remote-Verbindung Weg ist langsam dies in der Regel nicht kaufen Sie so viel.
Aus meiner Forschung zu diesem Thema, es gibt keine einfache Lösung oder bereits vorhandene Bibliotheken oder kommerzielle Produkte. Die einzige praktikable Lösung aus, was ich sagen kann ist zu beißen die Kugel und hand-code eine Lösung, das ist mehr Arbeit als es Wert für mich.
So, ich bin markieren diese als die richtige Antwort, obwohl es nicht die Lösung für das problem. 🙂