2009-07-03 2 views

ответ

11

Я думаю, что причина для использования GetOrdinal(), так что вы можете кэшировать результат и повторно использовать его несколько раз для повышения производительности.

E.g.

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

ли кто-нибудь представление о влиянии на производительность использования GetOrdinal (..) внутри цикла строк по сравнению, например, фактического извлечения данных из БД? –

+3

У меня есть тест производительности для службы веб-API, которая считывает около 30-40 записей из хранимой процедуры БД (с несколькими наборами результатов) и возвращает Json размером около 8 КБ. В этом тесте я заменил все GetOrdinal() на статические int-константы, и в результате я получил увеличение производительности на 2% ... так стоит ли создавать такой кеш имен столбцов? - Наверное, в большинстве сценариев нет. Чтение данных из базы данных и сериализации данных в Json в реальном сценарии повлияет на производительность больше, поэтому я думаю, что кэширование ординалов будет последним, что нужно делать, когда вы уже оптимизировали все остальное ... –

5

GetOrdinal выполняет поиск с учетом регистра в первую очередь. Если это не удается, выполняется второй поиск без учета регистра. GetOrdinal - нечувствительность к каналу. Поскольку ординарные поисковые запросы более эффективны, чем именованные, неэффективны для вызова GetOrdinal в цикле. Сэкономьте время, вызвав GetOrdinal один раз и присвоив результаты целочисленной переменной для использования в цикле.

Источник: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

+8

Word for Word копировать и вставлять с http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, ничего плохого в этом, как правило. – Malfist

+5

Ну, по крайней мере, это атрибут. – jpoh

1

Я просто хочу добавить, что контекст, сколько записей вы ждете играет большую роль, потому что если вы возвращаете одну строку, то разница в производительности между этими двумя не будет значительным. Однако, если вы перебираете много строк, то использование типизированного аксессура лучше для производительности, поскольку оно оптимизировано. Таким образом, в этом случае, если вам нужно получить лучшую производительность с помощью имени столбца, тогда вызовите GetOrdinal один раз, поместите его в переменную, а затем используйте типизированный accessor с порядковым номером столбца в вашем цикле. Это даст лучшую производительность.

, если вы хотите знать, разница в производительности проверить my blog post

Смежные вопросы