Laden...

Mit ADO.NET große Tabellen performant auslesen?

Erstellt von inTrance vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.734 Views
inTrance Themenstarter:in
170 Beiträge seit 2005
vor 17 Jahren
Mit ADO.NET große Tabellen performant auslesen?

Hallo!

Ich möchte per ADO.NET 2 möglichst schnell zwischen zwei verschiedenen Datenbank (-Systemen) kopieren. Dazu nutze ich die LIMIT-Anweisung, um mir Blöcke aus der Quelle zu holen und diese in das Ziel zu schreiben, während ich schon wieder neue Daten aus der Quelle hole.

Das LIMIT ist allerdings riskant, weil sich die Quell-Daten in der Zwischenzeit ja schon geändert haben könnten.

Gibt es möglicherweise weitere Methoden, um Daten "fließend" aus einer DB zu bekommen? Also ohne diese ewige Pause, wenn nach dem Select alle Daten erstmal zum Client geladen werden bevor man diese dann Zeile für Zeile ausliest?

Bin für jede Hilfe dankbar!

Grüße und schöne Osterfeiertage,

inTrance

F
10.010 Beiträge seit 2004
vor 17 Jahren

Klar, per DataReader.

EIn Sql-Insert Command mit Parameter erzeugen,
Connection mit einer Transaction öffnen,
aus reader lesen, mit command schreiben, bis der reader nichts mehr liefert.

Wenn Du den MS-SqlServer benutzt kannst Du auch BulkCopy benutzen.

Oder Du schaust dir mal den neuen Syncronisations service von MS an.

3.825 Beiträge seit 2006
vor 17 Jahren

Wenn es größere Datenmengen sind ist Bulkcopy "etwas" schneller.

Ich habe mal ca. 300 MB Daten eingefügt :

ADO.NET per Dataset : 16 h

Bulk Insert : 4 Minuten

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 17 Jahren

Wer für soetwas DataSet benutzt hat es nicht besser verdient 😉

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von FZelle
Wer für soetwas DataSet benutzt hat es nicht besser verdient 😉

Sehr freundlich von Dir, Frank, Deine Kommentare sind immer so aufbauend.

Hast Du eine Ahnung, warum in so einem Fall ein Dataset verwendet wurde? Vielleicht wurde ursprünglich etwas ganz anderes geplant und das Kopieren erst nachträglich benötigt?

Also bitte: halte nicht alle anderen für Idioten. Jürgen

F
10.010 Beiträge seit 2004
vor 17 Jahren

Komisch diese Diskusionen kommen immer und immer wieder,
und es ist immer der gleiche typus der sie anstösst.

Wenn Du dir einen Posche kaufst, und mit 200 km/h in eine Haarnadelkurve
einbiegst, den Wagen zerlegst, und mit inbrunnst zu den Anwesenden sagst,
"aber ein Porsche, der so schnell fahren kann muss das auch durch eine Haarnadelkrve können!",
wird dich jeder mit Recht einen Idioten nennen dürfen.

Wenn Du aber etwas vergleichbar Dummes in der EDV und speziell beim Programmieren machst,
und dir jemand dann nicht durch die Blume sagt, das das dumm ist,
wird dieser gleich angemacht.

Ich frage mich dann immer, wer hier nachdenken sollte.

inTrance Themenstarter:in
170 Beiträge seit 2005
vor 17 Jahren

Hallo!

Danke schon mal für die vielen Antworten. BulkCopy kommt für mich leider nicht in Frage, weil ich teilweise jedes Feld noch in verschiedene Datentypen konvertieren möchte - Nach Regeln die der Nutzer vorgibt.

Der DataReader scheint wirklich die Daten parallel zu laden - ist also ähnlich effektiv wie die Methode per LIMIT. Die Geschwindigkeit ist auf die Sekunde genau exakt die gleiche, aber das natürlich bei erhöhter Sicherheit..... oder? Die Datensätze können also nicht mehr durch UPDATES oder DELETES manipuliert werden, während ich noch beschäftigt bin diese per DataReader zu lesen, oder?

Hat jemand vielleicht noch allgemeine Tipps wie man Geschwindigkeit aus ADO.NET kitzeln kann? Die Geschwindigkeit ist nicht das allerwichtigste - Aber was sich gut wartbar und stabil realisieren lässt, nehme ich gerne. Unsere Kunden wollen teils gigantische DBs kopieren.

Das jetzige Schema: 2 Threads - Einer lädt durchgehend Daten in den Cache via DataReader. Wenn der Cache zu stark wächst wird der Thread gedrosselt. Ein anderer Thread schreibt die Daten in eine andere DB durch parameterisierte INSERTS.

Grüße,

inTrance

F
10.010 Beiträge seit 2004
vor 17 Jahren

Der DataReader ist schon das schnellste, was Du mit .NET mitteln bekommst.

Wenn Du keine zwischenverarbeitung hättest, wäre der genannte Sync Service
noch eine Idee, aber so wie Du es machst ist es, mit .NET mitteln das schnellste.

Schneller geht es nur mit den mitteln der jeweiligen DB, wenn sie soetwas bietet.