Autor Beitrag
Freiberger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 15.10.05 14:52 
Hy,

Ich habe eine Datenbank, wo täglich neue Daten aus EXCEL-Liste hizukommen.
Gibt es eine schnelle Möglichkeit um festzustellen, ob in der Datenbank komplette
Zeilen gleich sind ?
Oder kann ich sogar die Daten vorher schon prüfen,
damit sie nicht in die Datenbank kopiert werden ?

Ich habe schon ne Möglichkeit gefunden, das dauert aber zu lange, da in der Datenbank
ca. 1 Mio Zeilen mit 32 Spalten vorhanden sind und jeden Tag um die 1000 Zeilen dazukommen.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Sa 15.10.05 15:41 
:welcome: von mir.

Es gibt mehrere Möglichkeiten. Einige sind besser andere schlechter.
- Unique-Key über alle Felder. Beim Insert bekommst du eine Exception.
Problem: Kommt das oft vor, wird der Import langsam. Exceptions bremsen ganz gut, wenn sie ausgelöst werden.
- Vorab ein Select über alle Felder mit den neuen Daten als Suchkriterium.
Problem: Bei der Datenmenge kann das schon zu Geschwindigkeitsproblemen führen. Optimieren könntem man das, wenn für jedes Feld ein Index verfügbar wäre. Das kann aber an anderer Stelle (z.B.: Beim Bearbeiten, Erfassem und Löschen der DS) zu Geschwindigkeitseinbußen führen.
- Auslagerung des Imports in SPs. Mit einem Unique-Key über alle Felder würde dann zwar in der SP ein Fehler auftauchen, aber den musst du in Delphi ja nicht prüfen.

Welchen Weg hast du denn gewählt?
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 15.10.05 15:46 
ich hatte mal das gleiche Problem, Hier meine Lösung:
Prüfsumme (z.b. CRC32) über die Daten in der Excel-Tabelle
und mit dieser in der DB-Tabelle sichern. Index(Unique) auf Tabelle erstellen.

MS-SQL via StoredProcedure:
if exists (select CRC32 from Table where CRC32=:ExcelCRC32) begin
blablabla
end

Die Suche geht sehr schnell da Index, es werden nur die Daten eingefügt,
wenn der CRC nicht vorhanden ist, ansonsten verworfen.

Für den CRC32 gibts verschiedene Kompos, e.g. TurboPower.

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 15.10.05 15:49 
Danke erstmal, ich werde das alles mal versuchen.
Ist es normal, daß der Import von EXCEL-Listen so lange dauert ?
Fur eine Liste mit ca 5000 Zeilen brauche ich knapp 20 Sekunden !
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 15.10.05 15:59 
wie liest du denn ein und welche DB nimmst du denn?
Ich hab teilweise die Erfahrung gemacht, bei MS-SQL und Excel dauerts lange.
Da reicht dann einfach ein Import als CSV. Geht dann schneller.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 15.10.05 16:04 
OK, mal ganz langsam.

Ich habe eine leere Datenbank (xxx.db) und einen Ordner
mit tausenden EXCEL-Listen.
Ich durchsuche den Ordner nach neuen Listen, die ich noch nicht eingelesen habe.
In den neuen Listen können aber auch Daten aus älteren Listen vorhanden sein.

Ich lese alles über ne EXCEL-Apllication ein (gabs mal hier im Forum)

Das dauert alles ziemlich lange.
Außerdem muß ich immer prüfen, ob ich die letzte Zeile schon erreicht habe.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 15.10.05 17:14 
xxxx.db ??

hmmm- Kaffeesatzleserei... Paradox?dBase?

klär mich mal auf.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 15.10.05 17:24 
Sorry, hab erst vor kurzer Zeit mit Datenbanken angefangen.
Weiß auch nicht was da am besten und am schnellsten ist...
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 15.10.05 17:31 
ok.
also bei wie du schreibst Millionen von Datensätzen, sind die Filebasierenden Single-Datenbanken wie Access, Paradox und so wahrscheinlich etwas überfordert.
Ich empfehle eine etwas stabileres System like SQL-Server (MySQL, MSSQL,MSDE, SAPDB)

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 15.10.05 17:50 
Also: Ich hoffe, Du bemühst nicht EXCEL, um XLS-Dateien einzulesen, sondern eine BIFF-Library, die die Dateien wesentlich schneller einliest. Es gibt mittlerweile einige Tools, die das können, die einzige, die mit meinen Dateien klarkommt, ist aber XLSReadWriteII von axolot Data (90 Euro, glaube ich) (100ms pro Datei)

Dann: Wenn Du alleine mit der DB arbeitest, dann geht auch Access. Aber bitte nicht als Mehrplatzversion, also wo mehrere Leute gleichzeitig arbeiten. Wenn Du etwas Muße hast und wirklich was Anständiges haben willst, installier Dir die MSDE oder FB oder PostgreSQL. Mit Paradox habe ich auch in einer Einzelplatzversion schlechte Erfahrungen gemacht, weil es Paradox nun gar nicht mag, wenn der Rechner ausgeschaltet wird, ohne die DB zu schliessen. Das ist fatal, zumal das eine schlechte Angewohnheit der Anwender ist.

So, der Rest, der hier erzählt wurde, ist genau so, wie Du es anstellen solltest (CRC bilden, index darüber usw).

Hier, meine CRC unit.

EDIT: Wenn mySQL schon zu lahm ist, dann versuch die MSDE mit Transaktionen oder mit BCP. Letzteres macht ca. 10000 Records pro Sekunde.
Einloggen, um Attachments anzusehen!
_________________
Na denn, dann. Bis dann, denn.


Zuletzt bearbeitet von alzaimar am Sa 15.10.05 17:51, insgesamt 1-mal bearbeitet
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Sa 15.10.05 17:50 
MySQL hab ich versucht, das ist zu langsam.
Ich habe mein Programm auf Arbeit.
Ich schaue mal nach, dann kann ich es dir genau sagen.

Aber sortieren und filtern geht sehr schnell...
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 15.10.05 17:57 
user profile iconFreiberger hat folgendes geschrieben:
MySQL hab ich versucht, das ist zu langsam.
Ich habe mein Programm auf Arbeit.
Ich schaue mal nach, dann kann ich es dir genau sagen.

Aber sortieren und filtern geht sehr schnell...


*grübel*
ich bin ja eh kein Fan von MySQL, aber langsam?
Ich vermute hier arge probleme.
tse, tse.
Sei's drum. Nimm die MSDE (ist gratis)

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?