Anmelden

View Full Version : Geschwindigkeit beim Block-Transfer



BDehmel
20-06-08, 06:54
Hallo,

ich wollte einen Block-Transfer in einem meiner Programme durchführen, um die Netzwerklast zu senken, bzw die Anzahl der Fetches und der darauf resultierenden Antworten zu mindern.

Diesen initialisiere ich wie folgt:
// Row-Wise Binding: Groesse der Struktur wird uebergeben
if (! SQLSetStmtAttr (sqlStatement, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER) sizeof (S_BLOCK_PERSSTAMM), 0))
{
// Anzahl der zu lesenden Zeilen
if (! SQLSetStmtAttr (sqlStatement, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) sAnzahlRows, 0))
{
// Anzahl der gelesenen Zeilen
if (! SQLSetStmtAttr (sqlStatement, SQL_ATTR_ROWS_FETCHED_PTR, iAnzahlRowsRead, 0))
{
// Stati der einzelnen Zeilen
if (! SQLSetStmtAttr (sqlStatement, SQL_ATTR_ROW_STATUS_PTR, sStatusArray, 0))
{ ....

Leider war das Ergebnis genau das Gegenteil von dem, was ich bewirken wollte: Mit einem Fetch bekomme ich zwar alle Datensätze zurück, aber es dauert wesentlich länger als wenn ich jeden Datensatz einzeln hole.

Meine Vorstellung dazu ist (100 Datensätze):
Normal: 100 - Fetches, 100 - Antworten = 200 Netzwerkpakete
Block-Transfer: 2 - Fetches, 2 - Antworten = 4 Netzwerkpakete

Warum ist das so? Mache ich da etwas falsch?

Gruß Björn

Fuerchau
20-06-08, 07:37
Auf die interne Art der Ausführung hat man da sowieso keinen Einfluss.
Der Blocktransfer hat keinen Einfluss auf die Netzbelastung, da dies sowieso intern geregelt wird sondern ist reine Geschmackssache.

Was hier die Ursache ist, lohnt wohl kaum der Analyse.

Den einzigen Einfluss den du nehmen kannst ist die Art des Cursors.
Wenn du einen reinen Forwardcursur nimmst (kein dynamic scroll, for update o.ä.) wird ggf. die Natzbelastung sinken.

Ein Fetch löst nur dann einen Netztransfer aus, wenn keine Daten mehr im Puffer sind.

BDehmel
20-06-08, 07:53
Mein Cursor ist ein Forward Cursor.

Deinen letzten Satz (Ein Fetch löst nur dann einen Netztransfer aus, wenn keine Daten mehr im Puffer sind.) verstehe ich nicht ganz.

Heißt das, dass der Datenbanktreiber schon von sich aus, mehr Daten überträgt, als ich tatsächlich anfordere?