2009-07-03 3 views

risposta

11

Penso che la ragione per usare GetOrdinal() è in modo che è possibile memorizzare nella cache il risultato e riutilizzarlo più volte per le prestazioni.

E.g.

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

Qualcuno ha un'idea circa l'impatto sulle prestazioni di utilizzare GetOrdinal (..) looping fila rispetto ad esempio il recupero dei dati reale dal DB? –

+3

Ho un test delle prestazioni per un servizio API Web che legge circa 30-40 record dal DB memorizzato proc (con più set di risultati) e restituisce Json di circa 8 KB. In questo test ho sostituito tutti i GetOrdinal() con costanti int statiche e di conseguenza ho ottenuto un aumento del 2% delle prestazioni ... quindi vale la pena di creare questo tipo di cache dei nomi delle colonne? - Immagino che nella maggior parte dei casi non sia così. La lettura dei dati dal DB e la serializzazione dei dati su Json in uno scenario reale influenzerà maggiormente le prestazioni, quindi penso che il caching degli ordinali sarà l'ultima cosa da fare quando hai già ottimizzato tutto il resto ... –

5

GetOrdinal esegue innanzitutto una ricerca con distinzione tra maiuscole e minuscole. Se fallisce, viene effettuata una seconda ricerca insensibile al caso. GetOrdinal è insensibile alla larghezza di kana. Perché le ricerche ordinali sono più efficienti delle ricerche con nome, è inefficiente chiamare GetOrdinal all'interno di un ciclo. Risparmia tempo chiamando lo GetOrdinal una volta e assegnando i risultati a una variabile intera da utilizzare all'interno del ciclo.

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

+8

Copia parola per parola e incollata da http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, niente di sbagliato in questo, di solito. – Malfist

+5

Beh, almeno lo attribuisco. – jpoh

1

Voglio solo aggiungere che il contesto di quanti record vi aspettate gioca un ruolo importante, perché se si restituisce una singola riga allora differenza di prestazioni tra i due non sarebbero significative. Tuttavia, se si esegue il ciclo su più righe, l'utilizzo della funzione di accesso digitata è migliore per le prestazioni poiché è ottimizzato. In tal caso, se è necessario ottenere prestazioni ottimali utilizzando il nome di una colonna, chiamare una volta GetOrdinal, inserirla in una variabile e quindi utilizzare accessor digitato con la colonna ordinale nel ciclo. Ciò produrrebbe la migliore prestazione.

se siete curiosi di sapere la differenza di prestazioni controllare my blog post