AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schnelles durchlaufen von Tabellen?
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelles durchlaufen von Tabellen?

Ein Thema von Mauli · begonnen am 22. Mai 2003 · letzter Beitrag vom 22. Mai 2003
Antwort Antwort
Benutzerbild von Mauli
Mauli

Registriert seit: 7. Apr 2003
Ort: Wuppertal
160 Beiträge
 
Delphi 2005 Enterprise
 
#1

Schnelles durchlaufen von Tabellen?

  Alt 22. Mai 2003, 11:30
Guten Morgen. Ich habe 2 Tabellen, die recht groß sind. (Und einen Rechner, der sehr langsam ist ) Jetzt muss ich Datensätze suchen, die in bestimmten Werten übereinstimmen.

Ich habe das bisher so gemacht:
Delphi-Quellcode:
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
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.

Hat vielleicht jemand einen Vorschlag für mich wie ich so etwas schneller laufen lassen kann?

Danke
  Mit Zitat antworten Zitat
ShadowCaster

Registriert seit: 19. Mai 2003
71 Beiträge
 
Delphi 5 Enterprise
 
#2
  Alt 22. Mai 2003, 11:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mauli
Mauli

Registriert seit: 7. Apr 2003
Ort: Wuppertal
160 Beiträge
 
Delphi 2005 Enterprise
 
#3
  Alt 22. Mai 2003, 12:03
Ich nutze Paradox-Tabellen. Als Komponenten TwwTables.
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#4
  Alt 22. Mai 2003, 12:11
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.
  Mit Zitat antworten Zitat
ShadowCaster

Registriert seit: 19. Mai 2003
71 Beiträge
 
Delphi 5 Enterprise
 
#5
  Alt 22. Mai 2003, 12:17
Ich weiß nicht ob Paradox Parametrisierung unterstützt. Ansonsten Queries ohne Overhead oder das was Paul Jr. gesagt hat (wird schon stimmen )
  Mit Zitat antworten Zitat
Benutzerbild von Mauli
Mauli

Registriert seit: 7. Apr 2003
Ort: Wuppertal
160 Beiträge
 
Delphi 2005 Enterprise
 
#6
  Alt 22. Mai 2003, 12:23
Hi Paul Jr.

Zitat von Paul Jr.:
Hallo Mauli 8) ,

Ich hoffe, dass Du eine ID in Deiner SQL-Tabelle defieniert hast z.B. so:

ID Integer NOT NULL (selbstzählend)

So eine ID habe ich. Aber ich glaube ich hatte mich nicht ganz richtig in der Anfrage aufgedrückt.

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?
  Mit Zitat antworten Zitat
Benutzerbild von Mauli
Mauli

Registriert seit: 7. Apr 2003
Ort: Wuppertal
160 Beiträge
 
Delphi 2005 Enterprise
 
#7
  Alt 22. Mai 2003, 12:25
Hi ShadowCaster,

Zitat von ShadowCaster:
Ich weiß nicht ob Paradox Parametrisierung unterstützt. Ansonsten Queries ohne Overhead oder das was Paul Jr. gesagt hat (wird schon stimmen )
Ich kann mit 'Queries ohne Overhead' nichts anfangen
  Mit Zitat antworten Zitat
ShadowCaster

Registriert seit: 19. Mai 2003
71 Beiträge
 
Delphi 5 Enterprise
 
#8
  Alt 22. Mai 2003, 12:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mauli
Mauli

Registriert seit: 7. Apr 2003
Ort: Wuppertal
160 Beiträge
 
Delphi 2005 Enterprise
 
#9
  Alt 22. Mai 2003, 13:00
Danke ShadowCaster,

das hört sich doch schon gut an .

Ich mach mich mal schlau.
  Mit Zitat antworten Zitat
ShadowCaster

Registriert seit: 19. Mai 2003
71 Beiträge
 
Delphi 5 Enterprise
 
#10
  Alt 22. Mai 2003, 13:03
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz