Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MSSQL/ADO + 3 Mio Datensätze , Thread Error (https://www.delphipraxis.net/180711-mssql-ado-3-mio-datensaetze-thread-error.html)

p80286 12. Jun 2014 13:23

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Zitat:

Zitat von bernhard_LA (Beitrag 1262069)
Meine Anwendung ist ganz gut vergleichbar mit einem CAD Programm, wenn der Anwender auf den "Male Gegenstand auf Bildschirm, z.b. einen Pkw "
Button drückt dann läuft intern "select * from Tabelle"; soll ich beim Zeichnen des Autos die Reifen dann weglassen ????

Nein sollst Du nicht, aber wenn Du nur die Reifen ändern willst, dann interessiert sich niemand für die Kabelbäume.
Du solltest ggf. mal etwas weiter ausholen was Du erreichen willst, und welche Daten Du hast. Solange Du darauf bestehst 3Mio Datensätze einzulesen, woher kommen die überhaupt?, drehen wir uns nur im Kreis.

Gruß
K-H

Mikkey 12. Jun 2014 13:35

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Zitat:

Zitat von bernhard_LA (Beitrag 1262069)
Meine Anwendung ist ganz gut vergleichbar mit einem CAD Programm, wenn der Anwender auf den "Male Gegenstand auf Bildschirm, z.b. einen Pkw "
Button drückt dann läuft intern "select * from Tabelle"; soll ich beim Zeichnen des Autos die Reifen dann weglassen ????

Nein, aber das Motorrad...

Warum lässt Du in "intern" nicht 'Select * from Tabelle Where <gehört zum Gegenstand>" ablaufen. Es ist kaum vorstellbar, dass wirklich 3 Millionen Bestandteile zu einer Zeichnung gehören.

bernhard_LA 12. Jun 2014 13:52

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
sorry Jungs : das Hinterfragen ob ich wirklich 3 Mio Datensätze brauche ist sinnlos, es sind heute in unserem Problem-Projekt 3 Mio records - können aber auch mal deutlich mehr werden;



Delphi-Quellcode:
   //  von ~ 10 Records  bis zu 10 Mio .... alles ist technisch möglich
   ///   
   aquery.sql.add ('select* from database where material = 'Alu'');


   aquery.open;

   LoopIndex := aquery.recordCount
  for i:= 0 to LoopIndex do
      begin

         ReadSinglerecordFromTable;

         CopySingleRecordIntoObjectList;
     
         aquery.next;  //  ist natürlich auch enthalten :-)
     end;

   //  die ObjectList darf nur durch den verfügbaren Hauptspeicher am Computer begrenzt sein
   //  ich brauche alle Daten in der Liste !!!!!!!
   
   MachwasMitderObjectList;

   
   SchreibeObjectListInTabelleZurück,

mkinzler 12. Jun 2014 13:58

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Das ist nicht dein Ernst, Du liest 3+ Mio Datensätze ein, nur zu ermitteln wieviel es sind?

:shock:

Delphi-Quellcode:
aQuery.Sql.Text := 'select count(*) from database where material = :material;';
aQuery.Paramters.Params[0].asString := 'Alu';
aQuery.Open;
LoopIndex := aquery.Fields[0].asInteger;
sollte das Selbe machen nur halt schenller und mit minimalen Speicherverbrauch!!!

himitsu 12. Jun 2014 14:15

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Delphi-Quellcode:
   //LoopIndex := aquery.recordCount
  //for i:= 0 to LoopIndex do
  while not aquery.EOF do
      begin

         ReadSinglerecordFromTable;

         CopySingleRecordIntoObjectList;

         aquery.Next;

     end;
Für das Query ist das kein Problem, denn dem kann man ja sagen, daß es die Daten noch im Datenbankserver belassen soll und nur nach und nach die "benötigten" Records nachladen soll.
Aber mit deiner Liste kannst du dennoch an die Grenzen des lokalen Arbeitsspeichers stoßen.

Und nee, im Grunde braucht man die Liste nicht, wenn man die RecNo's der Datensätze nimmt und dann auf das Query zugreift.

mkinzler 12. Jun 2014 14:23

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Wobei ja auc h interessant wäre, was ReadSinglerecordFromTable() genau macht

bernhard_LA 12. Jun 2014 14:47

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Zitat:

Aber mit deiner Liste kannst du dennoch an die Grenzen des lokalen Arbeitsspeichers stoßen.
ist schon klar , darum bin ich auch bereits 32, 64 oder wenn denn sein muss 128 GByte RAM zu spendieren, ich bekomme halt die Krise wenn der ADOTable, ADOQuery .... mir ohne "Workaround" Optionen einen Strich durch die Rechnung machen.


Zitat:

Wobei ja auch interessant wäre, was ReadSinglerecordFromTable() genau macht

ganz einfach :


procedure ReadSinglerecordFromTable()
begin

aClass := TDatabaseClassContent.create;

CopyDBRecord (aClass ); // die meisten Felder der Klasse werden hier 1:1 aus der DB gefüllt

BerechneWas; // ein paar Sachen muss ich aber noch separat berechnen

end;

-=ZGD=- 12. Jun 2014 15:03

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Ich würde das ja mit
Code:
LIMIT
lösen.

Du kannst dir den Count() der Daten holen und dann den Index immer weiter verschieben. Das ist um einiges besser als x-Millionen Datensätze zur gleichen Zeit..

Edit: MSSQL hat keinen Limit-Befehl wie MySQL, richtig? :-(

Das könnte dir weiterhelfen: http://stackoverflow.com/questions/9...0-in-sqlserver


Schlagt mich nicht, wenn ich auf der falschen Fährte bin..

Jumpy 12. Jun 2014 15:21

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Zitat:

Zitat von bernhard_LA (Beitrag 1262085)
Zitat:

Aber mit deiner Liste kannst du dennoch an die Grenzen des lokalen Arbeitsspeichers stoßen.
ist schon klar , darum bin ich auch bereits 32, 64 oder wenn denn sein muss 128 GByte RAM zu spendieren, ich bekomme halt die Krise wenn der ADOTable, ADOQuery .... mir ohne "Workaround" Optionen einen Strich durch die Rechnung machen.


Zitat:

Wobei ja auch interessant wäre, was ReadSinglerecordFromTable() genau macht

ganz einfach :


procedure ReadSinglerecordFromTable()
begin

aClass := TDatabaseClassContent.create;

CopyDBRecord (aClass ); // die meisten Felder der Klasse werden hier 1:1 aus der DB gefüllt

BerechneWas; // ein paar Sachen muss ich aber noch separat berechnen

end;

Das klingt aber nun auch so, das die Daten zeitweilig doppelt im Speicher des Clients liegen, einmal in der Query und dann noch in den 3 Mio. daraus erstellten Objekten.

Wäre es da nicht einfacher sich mit der ursprünglichen Query nur die IDs zu holen und die CopyDBRecord Prozedur entsprechend anzupassen, dass die sich nur den jeweils einen Datensatz mit der aktuellen ID aus der DB holt?

pertzschc 12. Jun 2014 15:40

AW: MSSQL/ADO + 3 Mio Datensätze , Thread Error
 
Zitat:

Zitat von mkinzler (Beitrag 1262082)
Wobei ja auch interessant wäre, was ReadSinglerecordFromTable() genau macht

Das lesen eines Datensatzes wahrsscheinlich. Bei 3 Mio. würde ich die Laufzeit der Schleife gerne mal sehen.

Wobei dann weiterhin interessant wäre, was MachwasMitderObjectList(); genau macht...:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Seite 4 von 7   « Erste     234 56     Letzte »    

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