MES_K Geschrieben 17. März 2008 Geschrieben 17. März 2008 Hallo community... ... Ich beschäftige mich zur zeit mit dem kopieren von daten aus einer oracle datenbank nach access. Bis jetzt hab ich das mittels Dataset realisiert, welches mit hilfe eines oledbdataadapter die vorher erstellte acces db läd und dann anschließend die daten mittels oracledataadapter das dataset "aktualisiert" und anschließend wieder in access schreibt. Das funktioniert bei kleineren tabellen auch anstandslos. Jedoch bin ich heute auf das problem gestoßen, das bei großen tabellen (10000 datensätze und mehr) es 1. ewig dauert und sich der fortschritt nicht anzeigen lässt. und 2. der speicherbedarf der anwendung enorm anwächst. Nun meine frage: Wie würdet ihr das kopieren dieser daten möglichst effizient realiseren. Zitieren
Amstelchen Geschrieben 17. März 2008 Geschrieben 17. März 2008 das bei großen tabellen (10000 datensätze und mehr) 10000 datensätze sind nichts. du hast einen flaschenhals, der nciht durch die "menge" der daten entsteht. Wie würdet ihr das kopieren dieser daten möglichst effizient realiseren. OLE DB - auch über die klasse OleDbDataAdapter - ist ein guter weg. kannst du die relevanten codezeilen - inkl. performancerelevanter einstellungen des adapters - herzeigen? der speicherbedarf der anwendung enorm anwächst. access-DBs wachsen halt nun mal gerne auf unüberschaubare grössen, wenn viele daten geschaufelt werden, ohne dass die datenbank regelmässig komprimiert wird. stichwort: frontend/backend - die logik im frontend, die daten im backend - oder überhaupt das backend in der oracle lassen. s'Amstel Zitieren
MES_K Geschrieben 17. März 2008 Autor Geschrieben 17. März 2008 so, naja, jetzt bin ich schon zuhause.. und komm auch erst wieder am montag ins geschäft. aber dann kann ich dir meine einstellungen posten. jedoch hab ich da nicht wirklich viel eingestellt. code kann ich dann auch posten. naja, eigentlich sind unsere daten ja alle lokal auf dem oracle. jedoch schwirren bei uns interne anwendungen rum, die eben noch auf access aufsetzen. drum auch der gesamte aufwand. ach ja. hab mein programm heute mal mit ner etwas größeren (400 000 datensätze) durchlaufen lassen... hat ja nur ne gute stunde gedauert und als ergebnis ne access db mit ca 170 mb geliefert Zitieren
Amstelchen Geschrieben 17. März 2008 Geschrieben 17. März 2008 aber dann kann ich dir meine einstellungen posten. jedoch hab ich da nicht wirklich viel eingestellt. code kann ich dann auch posten. super, fein, da kann man mehr damit anfangen naja, eigentlich sind unsere daten ja alle lokal auf dem oracle. jedoch schwirren bei uns interne anwendungen rum, die eben noch auf access aufsetzen. drum auch der gesamte aufwand. diesen aufwand betreibe ich in meinem job die letzten 4 jahre - u.a. auch damit, access-datenbanken zu kippen und auf oracle und sql server aufzubauen. ich kenn das also. ach ja. hab mein programm heute mal mit ner etwas größeren (400 000 datensätze) durchlaufen lassen... hat ja nur ne gute stunde gedauert und als ergebnis ne access db mit ca 170 mb geliefert das hält sich ja direkt im rahmen. ich hab hier alte access-dbs um die 3,5 GB jede Zitieren
Argbeil Geschrieben 18. März 2008 Geschrieben 18. März 2008 Soweit ich weiß gibt es in Oracle ein Tool das die Daten selber in die Access Datenbank schreiben kann, bei MSSQL heißt das Integration Services, den Namen bei Oracle kenne ich nicht genau. Du kannst aber auch die SQL Server Integration Services nehmen um die Daten aus Oracle nach Access zu pumpen. Wenn es unbedingt ein Programm sein soll, machst du vermutlich was falsch. Ich Tippe du machst ein DataAdapter.Fill und kopierst das komplette Dataset in die Datenbank. Mach am besten einen DataReader auf die OracleDB und erzeuge für jeden gefundenen Datensatz ein Insert Statement das du direkt an Access gibst. Das ist nicht unbedingt schneller, braucht aber keinen speicher und du kannst den Fortschritt beobachten. Zitieren
Amstelchen Geschrieben 18. März 2008 Geschrieben 18. März 2008 ich nehme an, du meintest die oracle migration workbench. s'Amstel Zitieren
MES_K Geschrieben 18. März 2008 Autor Geschrieben 18. März 2008 @ Argbeil: ja, muss unbedingt ein programm sein, weil ich quasi nicht alle daten brauch, sonder nur daten, die mir bestimmte sql-abfragen liefern. Wenn das mit dem data-reader möglich ist, dann ist das wohl die lösung. Deine vermutung mit dataset.fill() stimmt. ich pump das bis jetzt in das ds rein... was natürlich zur folge hat, das das prog jede menge speicher frisst. Auf den speed kommt es mir in erster linie ja nicht an. sollte dann nur machbar sein, nen fortschritt erkennbar zu machen. Zitieren
Argbeil Geschrieben 18. März 2008 Geschrieben 18. März 2008 Ja, dann mach das doch so. Wenn du vorher ein Count(*) auf die Datenmenge machst, kannst du abschätzen wie viele Datensätze kopiert werden sollen, dann kannst du sogar einen Fortschrittsbalken anzeigen. Du machst eine OracleConnection auf und setzt ein OracleCommand ab, als Ergebnis bekommst du einen DataReader mit dem du über das Resultset iterrieren kannst, z.B. in einer while Schleife. In der Schleife fügst du jeden Datensatz händisch in Access ein, du solltest nur drauf achten die Connection zu Access erst zu schließen wenn du fertig bist. Alternativ kannst du auch deine Dataset Version behalten und einfach in Blöcken zu 100 DataRows lesen/schreiben, das ist evtl. noch einfacher. Zitieren
Fructis Geschrieben 26. März 2008 Geschrieben 26. März 2008 Wenn deine Access Datenbank viele Relationen zwischen den Tabellen aufweist, dann lösen die Inserts- und Update SQLs viel Traffic innerhalb der Microsoftschen ´DB-Verwaltung' aus, da alle Schlüssel auf die referentielle Intergrität überprüft werden. Bei großen Einfüge-Akltionen bzw. Aktualisierungen (ab ca. 50.000 Datensätzen wirds besonders schlimm). Diesen Effekt kannst du minimieren, wenn du die Relationen für deinen Kopiervorgang aus der Access-DB löscht, und hinterher wieder neu erstellt. Ciao Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.