![]() |
Schnelles durchlaufen von Tabellen?
Guten Morgen. Ich habe 2 Tabellen, die recht groß sind. (Und einen Rechner, der sehr langsam ist :freak: ) Jetzt muss ich Datensätze suchen, die in bestimmten Werten übereinstimmen.
Ich habe das bisher so gemacht:
Delphi-Quellcode:
Das ganze läuft recht lange. Und da ich das Ganze in anderer Form öfter machen muss läuft das Programm über 1,5 Stunden.
for i := Min to Max do
begin if tMatch_NetLiq.Locate('TRADER;NOMINAL;Kurs;Call_Put;Strike;Expiry_Date;ERL', VarArrayOf([tMatch_PrimeTRADER.Value, //tTrades_PrimeISIN.AsVariant, tMatch_PrimeNominal.AsVariant, //tMatch_PrimeValuta.AsVariant, tMatch_PrimeKurs.AsVariant, tMatch_PrimeCall_Put.AsVariant, tMatch_PrimeStrike.AsVariant, tMatch_PrimeExpiry_Date.AsVariant, FALSE]),[]) then begin //mach dies und das Hat vielleicht jemand einen Vorschlag für mich wie ich so etwas schneller laufen lassen kann? Danke |
Ich weiß zwar nicht welches Datenbankformat du nutzt, welche Datenbankkomponenten... aber ich denke ich kann dir ein paar grundlegende Hilfen nennen.
PS: Gib bitte dein Datenbanksystem und deine benutzten Komponenten mal an. Danke! - Also im Prinzip kannst du Queries ohne Overhead benutzen, wenn du eine Tabelle prüfen willst. Du musst nur im Vorhinein wissen, wieviele Datensätze in ihr sind, da diese Art von Queries keinen Positionsmarker zurückliefern. - Du kannst auch hergehen und deine Select-Abfragen parametrisieren. Dann weiß die Datenbank von vornhinein: Aha, jetzt kommen erstmal nurnoch Selectabfragen von dem Typ. Da muss ich ja nicht mehr soviel rechnen. Also kannst du nun deine Vergleiche mit Selectabfragen machen. - Die Verwendung von Stored Procedures geht natürlich auch. Da rufst du die stored procedure auf und die Datenbank arbeitet die SQL-Statements selbst ab und du musst nicht mehr soviel mit embedded SQL im Programm machen. Schneller müsste das auch sein. - Es gibt noch einen Lösungsweg. Du liest die Tabelle als Recordstruktur in eine TList und dann vergleichst du. Das lohnt sich in dem Fall wohl nicht und ich empfehle die ersten beiden Möglichkeiten. Falls diese Antwort jetzt überhaupt nicht auf deine Frage passen sollte, dann liegt das daran, dass du mir nichtmal Datenbanksystem und Komponenten genannt hast und man eher nur Lotto mit deinen Fragen spielen kann um eine Antwort zu finden ;) Ohne Informationen keine Antwort. |
Ich nutze Paradox-Tabellen. Als Komponenten TwwTables.
|
Hallo Mauli 8) ,
Ich hoffe, dass Du eine ID in Deiner SQL-Tabelle defieniert hast z.B. so: ID Integer NOT NULL (selbstzählend) In z.B. Query1 steht dann: SELECT ID FROM Tabelle WHERE PrimeNominal = blabla AND PrimeKurs = blaBla AND usw… und dann repräsentiert diese ID genau dieser Datensatz den Du suchst Also weiter: IF Query1.NOT EOF THEN tMatch_ NetLiq.Locate( und hier suchst Du nur ID) und stehst sofort an deinem Datensatz Tja... ich denke dies wird etwas schneller als dein bisheriger fetter Locate mit Varianten... viel Erfolg... Gruß Paul Jr. |
Ich weiß nicht ob Paradox Parametrisierung unterstützt. Ansonsten Queries ohne Overhead oder das was Paul Jr. gesagt hat (wird schon stimmen :mrgreen: )
|
Hi Paul Jr.
Zitat:
Ich habe 2 Tabellen und möchte daraus gleiche Datensätze rausfinden. Und die 'Matchen'. Wenn ich dich richtig verstanden habe, dann suche ich bei deinem Vorschlag erst die ID von einem Datensatz mit bestimmten Werten. Aber ich weiß von vornherein nicht, wie die Werte genau aussehen. Das Programm soll als Zeilen in beiten Tabellen makieren, in denen je die eine Zeile zu der anderen passt. Wo die Zeilen stehen und wie die genau aussehen interessiert erst mal nicht. Oder stehe ich jetzt wieder mal auf dem Schlauch? :drunken: |
Hi ShadowCaster,
Zitat:
|
Eine Query ist eine Datenbankabfrage. Es gibt Komponenten Namens TQuery (Standartmäßig bei Delpi 5 Enterprise dabei). Damit und mit der BDE kriegst du ne Paradox-Verbindung hin. Aber das ist jetzt mal nicht von Interesse.
Wenn du eine Query, also eine Abfrage auf der Datenbank öffnest und das 10000 Mal machst für jeden Datensatz und immer deine SQL-Abfragen schickst, dann werden pro Abfrage bis zu 300 Befehle auf der DB abgearbeitet (ist zumindest bei Interbase so, wenn du den SQL-Monitor mitlaufen lässt). Queries ohne Overhead senden viel weniger an die DB und sie hat auch viel weniger zu tun. Nachteil: Du bekommst bei Selectabfragen nicht raus, wieviele Datensätze zurückgekommen sind aber dafür arbeitet die Datenbank intern nurnoch so 3-50 Abfragen ab pro Selectbefehl und dadurch wird es nicht mehr wie vorher 1,5 Stunden, sondern vielleicht nurnoch 30 Minuten dauern. Nur dir das jetzt alles zu erklären ist nicht wenig. Du solltest ein SQL-Buch für Delphi lesen, wo erklärt wird, wie du mit Parametrisierung und Queries ohne Overhead arbeitest. |
Danke ShadowCaster,
das hört sich doch schon gut an :hello: . Ich mach mich mal schlau. |
Kein Problem. Zu dem Thema hab ich auch mal ein Buch mit ähm.. ich glaub 300 oder 600 Seiten durchgearbeitet, bis ich bescheid wusste. War allerdings für Interbase. Paradox wurde da nur angeschnitten. Es ist fraglich, ob es überhaupt Queries ohne Overhead für Paradox gibt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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