SQLDataReader работает медленнее, чем утилита командной строки sqlcmd? - PullRequest
0 голосов
/ 14 мая 2010

Недавно я рекомендовал коллеге заменить код C #, использующий утилиту командной строки sqlcmd, на SqlDataReader. Старый код использует: System.Diagnostics.ProcessStartInfo procStartInfo = новый System.Diagnostics.ProcessStartInfo ("cmd", "/ c" + sqlCmd); где sqlCmd что-то вроде "sqlcmd -S" + имя_сервера + "-y 0 -h-1 -Q" + "\" "+" ИСПОЛЬЗОВАНИЕ ["+ база данных +"] "+"; + txtQuery.Text + "\" "; \

Результаты затем анализируются с использованием регулярных выражений. Я утверждал, что использование SQLDataReader будет в большей степени соответствовать отраслевым практикам, проще в отладке и обслуживании и, возможно, быстрее. Однако подход SQLDataReader, по крайней мере, такой же скорости и, возможно, медленнее. Я считаю, что я делаю все правильно с SQLDataReader. Код:

using (SqlConnection connection =
         new SqlConnection())
        {
            try
            {
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
                connection.ConnectionString = builder.ToString(); ;
                SqlCommand command =
                    new SqlCommand(queryString, connection);

                connection.Open();



                SqlDataReader reader = command.ExecuteReader();

    // do stuff w/ reader 
                reader.Close();

            }
            catch (Exception ex)
            {
                outputMessage += (ex.Message);
            }
        } 

Я использовал System.Diagnostics.Stopwatch для определения времени обоих подходов, и утилита командной строки (вызываемая из кода C #) кажется быстрее (20-40%?). SqlDataReader имеет замечательную особенность, заключающуюся в том, что при повторном вызове того же кода он быстро высветляется, но для этого приложения мы этого не ожидаем.

Я уже провел некоторые исследования по этой проблеме. Я отмечаю, что утилита командной строки sqlcmd использует технологию OLE DB, чтобы поразить базу данных. Это быстрее, чем ADO.NET? Я действительно удивлен, тем более что подход с использованием командной строки предполагает запуск процесса. Я действительно думал, что это будет медленнее.

Есть мысли?

Спасибо, Dave

1 Ответ

0 голосов
/ 14 мая 2010

Я думаю, что SqlDataReader медленнее, чем sqlcmd, потому что создание SqlDataReader не только извлекает данные, но также получает информацию о схеме базы данных, а sqlcmd получает только данные. Вы можете получить имя столбца с помощью устройства чтения данных, например:

for (int i = 0; i < reader.FieldCount; i++)
{
    Console.WriteLine(reader.GetName(i));
}

Иногда производительность не важна, безопасность важнее. Но я не знаю, что является более безопасным, может быть SqlDataReader.

Я китаец, поэтому, возможно, мое слово неверно для грамматика, извините.

...