Ich versuche, ungefähr 200 Milliarden Zeilen von einem entfernten SQL Server abzurufen. Um dies zu optimieren, habe ich meine Abfrage darauf beschränkt, nur eine indizierte Spalte als Filter zu verwenden, und wähle nur eine Teilmenge von Spalten, um die Abfrage so aussehen zu lassen:
%Vor%Aber es sieht so aus, dass wenn ich meine Abfrage auf ein Zeitfenster von ein paar Stunden beschränke, die Abfrage in allen Fällen mit dem folgenden Fehler fehlschlägt:
%Vor% Das Zeitlimit ist wahrscheinlich ein Problem aufgrund der Zeit, die für die Ausführung des Abfrageplans benötigt wird. Da ich keine Kontrolle über den Server habe, habe ich mich gefragt, ob es eine gute Möglichkeit gibt, diese Daten über die einfache SELECT
hinaus, die ich verwende, zu erhalten. Gibt es irgendwelche SQL Server-spezifischen Tricks, die ich verwenden kann? Vielleicht dem Remote-Server mitteilen, dass er die Daten paginieren soll, anstatt mehrere Abfragen oder etwas anderes zu senden? Irgendwelche Vorschläge, wie ich das verbessern könnte?
Dies ist mehr von der Art von Job SSIS ist geeignet für. Sogar ein einfacher Ablauf wie ReadFromOleDbSource- & writeToOleDbSource würde dies handhaben und die notwendige Stapelverarbeitung für Sie erstellen.
Warum 200 Milliarden Zeilen auf einmal lesen?
Sie sollten sie pagen, indem Sie ein paar tausend Zeilen gleichzeitig lesen.
Selbst wenn Sie wirklich alle 200 Milliarden Zeilen lesen müssen, sollten Sie dennoch das Paging in Betracht ziehen, um das Lesen in kürzere Abfragen zu zerlegen - so, wenn ein Fehler auftritt, lesen Sie einfach weiter, wo Sie aufgehört haben.
Siehe effiziente Methode zur Implementierung von Paging für mindestens eine Methode zur Implementierung von Paging mit ROW_NUMBER
Wenn Sie eine Datenanalyse durchführen, vermute ich, dass Sie entweder den falschen Speicher verwenden (SQL Server ist nicht wirklich für die Verarbeitung großer Datenmengen ausgelegt), oder Sie müssen Ihre Abfragen so ändern, dass die Analyse im Server mit SQL.
Update: Ich denke, der letzte Absatz wurde etwas falsch interpretiert.
Speicher in SQL Server ist in erster Linie für Onlinetransaktionsverarbeitung (OLTP) ausgelegt - effiziente Abfrage von massiven Datensätzen in massiv gleichzeitiger Form Umgebungen (z. B. das Lesen / Aktualisieren eines einzelnen Kundendatensatzes in einer Datenbank mit Milliarden, während Tausende anderer Benutzer dasselbe für andere Datensätze tun). In der Regel besteht das Ziel darin, die Menge der gelesenen Daten zu minimieren, die Menge an IO zu reduzieren und Konflikte zu reduzieren.
Die Analyse, über die Sie sprechen, ist fast das genaue Gegenteil davon - ein einzelner Client, der aktiv versucht, ziemlich viele alle Datensätze zu lesen, um eine statistische Analyse durchzuführen.
Ja SQL Server wird dies verwalten, aber Sie müssen berücksichtigen, dass es für ein völlig anderes Szenario optimiert ist. Zum Beispiel werden Daten von Festplatte einer Seite (8 KB) gleichzeitig gelesen, obwohl Ihre statistische Verarbeitung wahrscheinlich nur auf 2 oder 3 Spalten basiert. Abhängig von der Zeilendichte und der Spaltenbreite verwenden Sie möglicherweise nur einen winzigen Bruchteil der Daten, die auf einer 8-KB-Seite gespeichert sind - die meisten Daten, die SQL Server lesen und belegen musste, wurden nicht einmal verwendet. (Denken Sie daran, dass SQL Server diese Seite auch sperren musste, um zu verhindern, dass andere Benutzer während des Lesens mit den Daten herumhantierten).
Wenn Sie ernsthaft mit der Verarbeitung / Analyse von massiven Datensätzen zu tun haben, dann gibt es Speicherformate, die für genau diese Art von Dingen optimiert sind - SQL Server hat auch einen Add-On-Service namens Microsoft Analysis Services , die zusätzliche analytische Online-Verarbeitung (OLAP) hinzufügen und Data Mining-Funktionen, die Speichermodi verwenden, die für diese Art der Verarbeitung besser geeignet sind.
Ich persönlich würde ein Datenextraktionstool wie BCP verwenden, um die Daten in eine lokale Datei zu bringen, bevor ich versuche, sie zu manipulieren, wenn ich versuche, so viele Daten gleichzeitig zu ziehen.
Dies ist keine SQL Server-spezifische Antwort, aber selbst wenn das rDBMS Server-seitige Cursor unterstützt, wird es als schlechte Form angesehen, sie zu verwenden. Dies bedeutet, dass Sie Ressourcen auf dem Server verbrauchen, obwohl der Server immer noch darauf wartet, dass Sie weitere Daten anfordern.
Stattdessen sollten Sie die Verwendung Ihrer Abfrage so umformulieren, dass der Server die gesamte Ergebnismenge so schnell wie möglich übertragen kann und Sie und Ihre Abfrage vollständig vergessen, um Platz für die nächste Abfrage zu machen. Wenn die Ergebnismenge zu groß ist, um sie auf einmal zu verarbeiten, sollten Sie die letzte vom aktuellen Stapel zurückgegebene Zeile verfolgen, damit Sie an dieser Position einen anderen Stapel abrufen können.
Einfach das gleiche Problem, ich hatte auch die Nachricht um 10:01 nach dem Ausführen der Abfrage.
Überprüfen Sie diesen Link . Es gibt eine Remote-Abfrage-Timeout-Einstellung unter Verbindungen, die standardmäßig auf 600 Sekunden eingestellt ist, und Sie müssen sie auf Null (unbegrenzt) oder einen anderen Wert ändern, den Sie für richtig halten.
Versuchen Sie, die Timeout-Eigenschaft der Remote-Serververbindung zu ändern.
Gehen Sie zu SSMS, stellen Sie eine Verbindung zum Server her, klicken Sie mit der rechten Maustaste auf den Namen des Servers im Objekt-Explorer, wählen Sie Properties -> Connections
und ändern Sie den Wert im Textfeld Remote query timeout (in seconds, 0 = no timeout)
.
Tags und Links sql sql-server sql-server-2008