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



Hallo Achim,

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

ok, verstanden. Aber das Argument, daß weniger Daten durch
> die Leitung müssen zählt auch noch beim .Net Assembly, oder?

Ja.

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.

So hatte ich mir das vorgestellt, aber das ist nicht das, was ich
beobachte. Ich bin wie gesagt eher .Net Entwickler als T-SQL Guru,

(Ich bin genauso Entwickler, nur einer der sich zudem fürs SQL Server
Innenleben interessiert)

von daher kann ich beim Cursor nicht ganz folgen. Mir ist klar,
> daß ich in 'ner Stored Procedure einen Cursor aufmachen und mit ihm
> über die Daten iterieren kann.

Das war jetzt die Illustration des .NET Assembly <-> Stored Procedure

> Ich glaube mich aber gelesen zu haben, daß man von sowas möglichst die
> Finger lassen soll.

Zum einen gilt: Ein DataReader in einer SQL Server Assembly ist
nichts besser als ein herkömmliche Prozedur mit DECLARE Cursor.

Zum anderen: In der einen oder anderen Weise hast Du beim Client Zugriff
immer mit einem Cursor zu tun (das gilt bei DAO, ADO, ADO.NET usw).

Nur gibt es dabei bessere und schlechtere (FASTFORWARD ist der bessere ;-)
Optimal wäre (nur nicht immer einfach realisierbar) gar keiner,
das wäre eben INSERT ... SELECT - in Deinem Falle mit XQuery garniert.
Wobei bei komplexen Verarbeitungen das in Frage gestellt werden darf,
wenn die Verarbeitung nicht mehr durch eine oder einige wenige
Anweisungen auf dem Server erledigt werden kann.

Dann wiegt der Overhead durch das ineffizientere Lesen (da der
SQL Server dabei keine blockweise Verarbeitung vornehmen kann)
und der zusätzliche Netztransport weniger, als man durch die
beschränkteren Ausdruckmöglichkeiten

Und eine .NET Assembly kann schon Sinn machen. Nur müßte dort
einiges mehr als eine Read (FETCH) Schleife stehen. Wenn der
weitere Code 90% oder mehr der Zeit ausmacht, wäre das durchaus
zulässig.

Trotzdem wüßte ich gerne, warum mein DataReader sich anders verhält!?
Ich hab' gesucht, aber keine Parameter gefunden, mit denen ich das
Verhalten ändern kann. Zumal der DataReader ja von Hause aus schon
forward-read-only ist!?

Ist er immer - deswegen auch der Vergleich. Auch wenn der nicht
immer 100% hinkommt, so ist er so organisiert, dass der SQL Server
den wenigsten Verwaltungsaufwand benötigt.

Was könnte ich falsch machen?

Prüfe zunächst mal ob die Ursache unabhängig vom Zugriff ist.

Wie lange dauert ein "SELECT TOP(10) * FROM RawDocument"
Wenn das schnell ist, so führe mal Deinen Code auf dem
Server selbst aus (einfache Leseschleife wie im Assemblyversuch)
- dabei sollten keine großen Unterschiede messbar sein.

Tritt die Zeitverzögerung unabhängig davon auf, wäre zu prüfen,
ob da etwas blockiert - d. h. andere Anwendungen auf die RawDocument
Tabelle zugreifen (ggf. auch Deine eigene Testumgebung)

Oder - wenn es übers Netzwerk geht - ob da ein Flaschenhals ist.

Gruß Elmar
.



Relevant Pages

  • RE: OLE DB Provider - how tell to not use cursor internally for jo
    ... from server to client. ... me under SQL 2000 error, because DBE OLE provider use cursor for join tables. ... Under SQL 7.0 it run well, the cursor isn't use for join tables. ...
    (microsoft.public.sqlserver.programming)
  • Re: Lookup executes 3 time upon Recordset.Save
    ... client side cursor and the SQL is now only executed once. ... executing my code three times (the code below is simplified fro ... > and {SQL Server} drivers): ...
    (microsoft.public.data.ado)
  • Re: SQL Server 2005 cursor incompatibility issue, will not update through adodb recordset
    ... SQL Instance name is the same as the machine name. ... I think I caused the problem by renaming the machine after installing ... The application is trying to update through a cursor ... and an SQL Server ODBC and receives this error each time it tries to ...
    (microsoft.public.sqlserver)
  • Re: Cursors - Server Side - Only Forward?
    ... You're using VB's ADO.Recordset object to manipulate the cursor data. ... Using server side cursors would ... > Dim Dbs As New ADODB.Connection ... > ' Prepare SQL Select statement ...
    (microsoft.public.sqlserver.programming)
  • Erneutes Lesen von Datensätzen
    ... (SQL Server 2000) ... Wenn nun in einer Form die Daten vom Server gelesen worden sind (alle Daten ... sind nun sichtbar) und der Benutzer den Cursor von einem Record auf den ...
    (microsoft.public.de.access.clientserver)