none
Increase rows per batch/fetchsize with OLEDB/MSOLEDBSQL driver? RRS feed

  • Frage

  • Hey guys,

    is there an option to configure the OLEDB / MSOLEDBSQL driver to fetch more rows per request?
    In my test case the transfer speed is very low (max. 15-19 mb /s) with a simple SELECT * from;

    The database system shows the wait event "ASYN_NETWORK_IO". So i think there is a bottleneck in the driver configuration.

    Any ideas?
    Thanks in advance.
    Dienstag, 27. September 2022 14:42

Alle Antworten

  • Schau bitte hier, es ist nicht Sache des SQL-Servers sondern des Netzes wieviele Zeilen du durchs Netz bekommst und wie schnell dein Programm ist, die Daten abzurufen:

    https://social.msdn.microsoft.com/Forums/en-US/05d0f713-b082-4290-92a9-e71bf497c9eb/regarding-network-buffer-and-datareader-data-fetch-c?forum=csharpgeneral

    Ich habe da durchaus schon mal Messungen gemacht.
    Wenn ich mit einem Servercursor arbeite und die Daten ausschließlich lese, kann ich mehr Daten lesen als bei der Verarbeitung. Das laden eines Resultsets oder in C# einer DataTable dauert länger als das direkte Verarbeiten mittels Reader.

    Im JDBC-Treiber gibt es zwar Einstellungen wie setFetchRowSize, die hat aber meist keine Auswirkung mehr.

    Dienstag, 27. September 2022 15:15
  • In my test case the transfer speed is very low (max. 15-19 mb /s) with a simple SELECT * from

    Wie Albert Einstein sagte, alles ist relativ, auch die Geschwindigkeit. Wenn gleichzeitig anderer Netzwerk-Traffic abläuft, wird es in der Summe langsam.

    MSOLEDBSQL driver to fetch more rows per request?

    In dem Treiber ist keine angezogene Handbremse verbaut, von daher: Nein, es gibt keine Einstellung dazu.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 28. September 2022 05:01
  • Hallo zusammen,
    Leider kann ich eure Meinungen/Feststellungen nicht teilen.

    Wir haben alle erdenklichen Szenarios nachgestellt. (Neue VM, Phyisikalischer Server, alles auf einem Host, alles in einer gekapselten Umgebung, etc). Und nein das Netzwerk ist es auch nicht (10 Gbit Netz und diverse Netzwerk Tests durchgeführt). Andere Hardware Ressourcen Engpässe sind ebenfalls ausgeschlossen.

    Wir rufen per SSAS alle Tabellen aus dem SQL Server ab. Und die Geschwindigkeit pendelt sich immer bei ca. 15-19 mb/s ein. Es passiert nur ein SELECT * FROM.

    Anhand des SQL Profiler kann man sehen das dort etwas steht von "100 Rows" pro request steht. Leider kann man das nicht genau deuten, da ich natürlich kein OLEDB Profi bin. Bei zig Millionen rows dauert es deshalb eine halbe Ewigkeit. Das gleiche kann ich per SSMS Export/Import Utlity nachstellen. Dementsprechend MUSS es dort eine Bremse geben.

    Also was für Möglichkeiten gibt es das mehr rows pro request verarbeitet werden ohne das ich irgendeinen Code verändern muss? Denn das ist nicht möglich, da der Treiber mir von Microsoft vorgegeben ist.
    Dienstag, 4. Oktober 2022 10:05
  • Wie bereits beschrieben, leider keine.
    Wen ich einen simplen "Select * from MyTable" mit 105 Spalten absetze, kann ich in C# mit ca. 95.000 Zeilen/Sekunde aus einem DBDataReader via ODBC lesen.
    Lade ich dieselben Daten per C# DBDataAdapter direkt eine DataTable, bewegt sich das nur noch bei ca. 9.500 Zeilen/Sekunde, wobei der Vorgang immer langsamer wird.

    Verwende ich eine Tabelle mit 9 Spalten, so habe ich eine reine Lesezeit von 160.000 Zeilen/Sekunde, beim Laden in die DataTable habe ich immer noch 48.800 Zeilen / Sekunde.

    Somit besteht seitens Treiber/SQL-Server keinerlei Einschränkung.

    Gemessen mit Tabellen á 1 Mio. Zeilen auf einem Laptop mit 2,4GHz.
    Ich habe mal für einen Kunden einen SQL-Tester entwickelt um nachzuweisen, dass  die Verarbeitungsgeschwindigkeit entscheidend ist und nicht die Lesegeschwindigkeit.

    Schreibe ich die Daten nun in eine andere DB, dann hängt es von den Möglichkeiten der Ziel-DB ab.
    Single-Inserts gehen im Schnitt mit 4-5000 Zeilen /Sekunde.
    In C# mit dem SQLBulkCopy (oder Bulkload im SSIS) gehen da durchaus 30-40000 Zeilen /Sekunde, je nach Anzahl Spalten.

    Dienstag, 4. Oktober 2022 10:37