2009-07-03 14 views

Respuesta

11

creo que la razón para usar GetOrdinal() es para que pueda almacenar en caché el resultado y reutilizarlo varias veces para el rendimiento.

E.g.

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

¿Alguien tiene una idea sobre el impacto en el rendimiento de la utilización de GetOrdinal (..) en el interior del bucle fila en comparación con, por ejemplo, la recuperación de los datos reales de la base de datos? –

+3

Tengo una prueba de rendimiento para un servicio de API web que lee aproximadamente 30-40 registros del proceso almacenado de DB (con varios conjuntos de resultados) y devuelve Json de aproximadamente 8 KB de tamaño. En esta prueba, reemplacé todas las constantes GetOrdinal() por constantes estáticas y como resultado obtuve un aumento del 2% en el rendimiento ... ¿Vale la pena el esfuerzo para crear ese tipo de caché de nombres de columna? - Supongo que en la mayoría de los casos no. Leer datos de DB y serialización de datos en Json en situaciones reales influirá más en el rendimiento, por lo que creo que el almacenamiento en memoria caché de ordinales será lo último que hacer cuando ya haya optimizado todo lo demás ... –

5

GetOrdinal realiza primero una búsqueda de mayúsculas y minúsculas. Si falla, se realiza una segunda búsqueda que no distingue entre mayúsculas y minúsculas. GetOrdinal es insensible al ancho kana. Debido a que las búsquedas basadas en ordinales son más eficientes que las búsquedas con nombre, es ineficiente llamar al GetOrdinal dentro de un bucle. Ahorre tiempo llamando al GetOrdinal una vez y asigne los resultados a una variable entera para usar dentro del ciclo.

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

+8

Copiar palabra por palabra y pegar desde http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, no hay nada de malo en eso, por lo general. – Malfist

+5

Bueno, al menos se lo atribuye. – jpoh

1

sólo quiero añadir que el contexto de la cantidad de registros que está esperando juega un papel muy importante porque si va a devolver una sola fila y luego diferencia de rendimiento entre los dos no serían significativos. Sin embargo, si realiza un bucle en varias filas, entonces, usar el acceso de escritura mecanografiado es mejor para el rendimiento, ya que está optimizado. Entonces, en ese caso, si necesita obtener el mejor rendimiento mediante el uso de un nombre de columna, llame a GetOrdinal una vez, colóquelo en una variable y luego use el descriptor de acceso tipeado con la columna ordinal en su ciclo. Esto produciría el mejor rendimiento.

si eres curioso acerca de la diferencia de rendimiento echa un vistazo a my blog post

Cuestiones relacionadas