Verarbeiten großer SQL-Select-Abfragen / Lesen von SQL-Daten in Chunks

8

Ich verwende .NET 4.0 und SQL Server 2008 R2.

Ich führe eine große SQL-Auswahlabfrage durch, die Millionen von Ergebnissen zurückgibt und lange dauert, bis sie vollständig ausgeführt wird.

Weiß jemand, wie ich nur einige der von der Abfrage zurückgegebenen Ergebnisse lesen kann, ohne auf die vollständige Abfrage warten zu müssen?

Mit anderen Worten, ich möchte die erste von 10.000 Datensätze Chunks lesen, während die Abfrage noch ausgeführt wird und die nächsten Ergebnisse erhalten.

    
Omri 20.04.2011, 06:52
quelle

3 Antworten

11

Es hängt teilweise davon ab, ob die Abfrage selbst streamt, oder ob sie in temporären Tabellen viel Arbeit verrichtet, dann (endlich) beginnt, Daten zurückzugeben. Sie können nicht viel im zweiten Szenario tun, außer die Abfrage neu zu schreiben; Im ersten Fall würde jedoch normalerweise ein Iteratorblock helfen, d. h.

%Vor%

Dies ist jetzt ein Streaming-Iterator - Sie können foreach darüber setzen und Datensätze werden live von den eingehenden TDS-Daten abgerufen, ohne zuerst alle Daten zu puffern.

Wenn Sie (vielleicht weise) Ihren eigenen Materialisierungscode nicht schreiben möchten, gibt es Tools, die das für Sie erledigen - zum Beispiel wird LINQ-to-SQL's ExecuteQuery<T>(tsql, args) das obige schmerzfreie tun / p>     

Marc Gravell 20.04.2011, 07:05
quelle
2

Sie müssten Datenpaging verwenden.

SQL Server hat die TOP-Klausel ( SQL TOP 10 a, b, c von d ) und BETWEEN :

%Vor%

Ich denke, dass Sie in der Lage sein werden, eine Anzahl von N Zeilen zu erhalten, eine partielle Verarbeitung durchzuführen, dann die nächste Anzahl von Zeilen zu laden und so weiter.

Dies kann erreicht werden, indem eine Multithread-Lösung implementiert wird: Eine wird Ergebnisse abrufen, während die andere asynchron auf Daten wartet und eine Verarbeitung durchführt.

    
Matías Fidemraizer 20.04.2011 07:12
quelle
0

Wenn Sie wirklich Millionen von Datensätzen verarbeiten müssen Warum laden Sie nicht 10.000 pro Runde und verarbeiten dann die nächsten 10.000? Wenn nicht, sollten Sie das DBMS verwenden, um die Daten vor dem Laden zu filtern, da die Leistung in der Datenbank viel besser ist als in Ihrer Logik.

Oder folgen Sie einem Lazy Load-Konzept und laden Sie nur die IDs, in die Sie die eigentlichen Daten nur dann laden, wenn Sie sie benötigen.

    
CloudyMarble 20.04.2011 07:06
quelle

Tags und Links