2009-07-03 5 views

Antwort

11

denke ich, dass der Grund GetOrdinal zu verwenden() ist so, dass Sie das Ergebnis zwischenspeichern und mehrfach für die Leistung verwenden können.

z.

Dim reader As SqlClient.SqlDataReader 
int valueOrdinal = reader.GetOrdinal("value"); 
while (...) 
{ 
    var value = reader.GetString(valueOrdinal); 
} 
+0

Hat jemand eine Idee über die Auswirkungen auf die Leistung haben GetOrdinal der Verwendung von (..) innerhalb Reihe Schleife im Vergleich zu beispielsweise dem tatsächlichen Datenabruf von DB? –

+3

Ich habe einen performamce-Test für einen Web-API-Dienst, der etwa 30-40 Datensätze aus DB Stored Proc (mit mehreren Resultsets) liest und Json von ca. 8K Größe zurückgibt. In diesem Test habe ich alle GetOrdinal() durch statische Int-Konstanten ersetzt und als Ergebnis habe ich eine 2% ige Steigerung der Performance erreicht. Es lohnt sich also, einen solchen Cache für Spaltennamen zu erstellen. - Ich denke in den meisten Szenarien nicht. Lesen von Daten aus DB und Daten-Serialisierung zu Json in realen Szenarien beeinflussen die Leistung mehr, so denke ich Caching von Ordnungszahlen wird die letzte Sache zu tun, wenn Sie bereits alles andere optimiert ... –

5

GetOrdinal führt zuerst eine Suche nach Groß-/Kleinschreibung durch. Wenn es fehlschlägt, wird eine zweite Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. GetOrdinal ist kana-width insensitive.Weil ordinalbasierte Suchvorgänge effizienter sind als benannte Suchvorgänge, ist es ineffizient, GetOrdinal innerhalb einer Schleife aufzurufen. Sparen Sie Zeit, indem Sie einmal GetOrdinal aufrufen und die Ergebnisse einer ganzzahligen Variablen für die Verwendung in der Schleife zuweisen.

Quelle: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

+8

Word für Word kopieren und einfügen von http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, daran ist normalerweise nichts falsch. – Malfist

+5

Nun, zumindest Attribut. – jpoh

1

Ich möchte nur hinzufügen, dass der Kontext, wie viele Datensätze Sie erwarten eine große Rolle spielt, weil, wenn Sie eine einzelne Zeile dann Performance-Unterschied zwischen diesen beiden Rückkehr nicht signifikant wäre. Wenn Sie jedoch viele Zeilen durchlaufen, ist die Verwendung von typisierten Accessoren für die Leistung besser, da sie optimiert ist. Wenn Sie also in diesem Fall die beste Leistung erzielen möchten, indem Sie einen Spaltennamen verwenden, rufen Sie GetOrdinal einmal auf, geben Sie es in eine Variable ein und verwenden Sie dann den typisierten Accessor mit der Ordnungszahl der Spalte in Ihrer Schleife. Dies würde die beste Leistung erbringen.

, wenn Sie neugierig auf die Performance-Unterschied sind Besuche my blog post

Verwandte Themen