Re: Daten schnell lesen (Gegenstück zu BULK INSERT?)

Tech-Archive recommends: Speed Up your PC by fixing your registry



Hallo Achim,

Achim Domma schrieb:
Hallo Elmar,

vielen Danke schonmal für die hilfreichen, ausführlichen Ausführungen.
Ich bin gerade mit den verschiedenen Optionen, die du mir aufgezeigt
hast am experimentieren. Da stellen sich gleich ein paar Folgefragen:

Diese Schritte könntest Du serverseitig erledigen, was die
übertragene Datenmenge reduzieren kann.

Um das zu testen hab' ich mir folgende C# Funktion gebaut:

Mit "servserseitig" meinte ich keine .NET Assembly.
Damit meinte ich eine direkte Verarbeitung mittels
XML Funktionalität des SQL Servers.

[ Code ]

Ich hätte damit gerechnet, daß der Aufruf recht schnell geht.

Trotzdem erstmal einige Anmerkungen dazu:
Bei einer Funktion in einer .NET Assembly kommt zunächst
einiges an Overhead hinzu beim ersten Aufruf das Initialisieren
einer AppDomain, Jitten des Codes usw. Weitere Aufrufe sollten
schneller laufen, solange die AppDomain nicht wieder entladen
wird.

Als Vergleich führe das SELECT in einer Standard Prozedur aus.
Obiger Code entspräche dabei einem FAST_FORWARD Cursor mit
10maligem FETCH (näheres findest Du unter DECLARE CURSOR).

> Scheinbar baut das ExecuteReader einen komplettes Resultset auf.

Normalerweise nicht. Da Du kein ORDER BY oder etwas
verwendest was eine vorherige Verarbeitung benötigt,
wird die ersten Datenseite (üblicherweise mit Hilfe
des Clustered Index) gelesen und die 10 Zeilen geliefert
(was bei Standardzeilengrößen in eine Datenseite passen sollte).

Auf jeden Fall dauert der Aufruf ewig. Bekomme ich
diesen Aufruf irgendwie schnell? Ich kann mit der DB fast tun und
lassen was ich will, kenne mich aber mit Locking-Optionen u.ä. nicht
wirklich aus.

Da müßtest Du schon mal 8 Threads (oder Programminstanzen)
starten und diese jeweils einen Teil der Daten verarbeiten
lassen. Mit einem einzelnen DataReader funktioniert das
naturgemäß nicht.

Wie verhält der SQL Server sich denn bzgl. mehrerer Prozessoren?

Der lastet die aus, wenn er Gelegenheit dazu hat. Ein einfaches
SELECT wie oben wird aber mit einem Prozessor bedient, da dort
eine parallele Abfrage schon mal keinen Sinn ergibt.

Ich habe eine Methode, die einen Record bekommt, diesen analysiert
> und daraus mehrere Inserts auf eine andere DB generiert.

Ohne wenigstens ansatzweise zu sehen, was Du mit dem XML machst,
kann ich dazu wenig sagen. Idealerweise wäre das etwas wie
INSERT INTO LinkedServer..Tabelle (...)
SELECT ... FROM XQueryAusdruck

Ein ADO.NET DataReader ist schon die schnellste Methode,
die Daten aus einem SQL Server rauszubekommen.

Wie oben beschrieben, wollte ich mal testen, wie schnell so ein
SqlDataReader im SQL Server ist.

Die Aussage bezog sich auf die Verarbeitung via Client.
Wie oben gesagt, entspricht das näherungsweise einem
FAST_FORWARD Cursor.

Und damit der Client mehrere Prozessoren auslasten kann, müsstest
Du mehrere Threads arbeiten lassen, die jeweils eine eigene
Verbindung und eigenen DataReader erhalten. Wobei der Hauptthread
die Verteilung vornehmen würde.

Gruß Elmar
.



Relevant Pages

  • Re: Daten schnell lesen =?ISO-8859-1?Q?=28Gegenst=FCck_zu_BU?= =?ISO-8859-1?Q?LK_INS
    ... Damit meinte ich eine direkte Verarbeitung mittels ... 10maligem FETCH (näheres findest Du unter DECLARE CURSOR). ... Ein DataReader in einer SQL Server Assembly ist ... Anweisungen auf dem Server erledigt werden kann. ...
    (microsoft.public.de.sqlserver)
  • Re: Performancefrage
    ... > Da meine Prozedur sich die 1,2 Mio. ... Daten in einen Cursor ... > zieht und in einer Schleife abarbeitet (jeder Datensatz ... wie man am performantesten so eine Verarbeitung ...
    (microsoft.public.de.sqlserver)
  • RE: mehrfachnutzung einer Funktion
    ... Ein Cursor scheint sich dafür nicht zu eigenen. ... Hallo Uwe, ... keine satzweise Verarbeitung wie recordsets oder cursor, ...
    (microsoft.public.de.sqlserver)