Необычные проблемы SQL / данных - PullRequest
0 голосов
/ 16 января 2012

У нас есть отчет, который дает нам серьезные проблемы, поэтому я решил поместить его в консольное приложение для устранения проблем.

Отчет представляет собой простой выбор SQL, возвращающий приблизительно 25 столбцов, и наш диапазон дат может составлять 3-6 месяцев, возвращая около 10 тыс. строк, поэтому мы не говорим о большом количестве данных.

Вот что происходит, когда отчет запускается, время ожидания с нашего веб-сайта, в консоли, для завершения требуется где-то от 13-18 минут, кажется, что ожидание происходит на

da.Fill(ds);

Теперь это странная вещь: она запускается приблизительно в течение 1-3 секунд в среде SQL Server Management Studio, и когда наши разработчики Delphi создают подобное приложение, запускается также несколько секунд, это происходит только с использованием .NET

Мы попытались перейти от набора данных к загрузке в хранилище данных, используя этот код ..

using (var dr = _command.ExecuteReader())
{
  if (dr.HasRows)
  {
    int i = 0;
    while (dr.Read())
    {
      var startRead = DateTime.Now;
      Console.Write("{2}\t{0}\t{1}\t", dr.GetInt32(0), dr.GetString(1), i);
      var tookRead = DateTime.Now.Subtract(startRead);
      Console.WriteLine("Took: " + tookRead);
      i++;
    }
}
Однако это совсем не помогло, оно просто отображается в чанках, но имеет частые задержки. Я думаю, что это SQL, но не могу объяснить, почему он отлично работает в Delphi и в SQL Management Studio.

Я пытался использовать .NET 2.0, 3.5 и 4, происходит на всех платформах.

Вот мой код

public static DataSet GetData()
{
  var now = DateTime.Now;
  var _command = new SqlCommand();
  var _connection = new SqlConnection();

  try
  {
    _connection.ConnectionString = connectionString;

    _command.Connection = _connection;
    _command.CommandText = storedProcedure;
    _command.CommandType = CommandType.StoredProcedure;
    _command.CommandTimeout = 60;

    if (string.IsNullOrEmpty(_connection.ConnectionString)) { throw new Exception("Connection String was not supplied"); }

    _command.Parameters.Add(new SqlParameter("DateFrom", dateFrom));
    _command.Parameters.Add(new SqlParameter("DateTo", dateTo));

    SqlDataAdapter da;
    var ds = new DataSet();

    _connection.Open();

    var done = DateTime.Now;

    da = new SqlDataAdapter(_command);
    da.Fill(ds);

    if (ds == null) { throw new Exception("DataSet is null."); }
    if (ds.Tables.Count == 0) { throw new Exception("Table count is 0"); }

    var took = done.Subtract(now);

    return ds;

  }
  catch (Exception ex)
  {
    File.WriteAllText(Path.Combine(Application.StartupPath, String.Format("Exception{0:MMddyyyy_HHmmss}.log", DateTime.Now)), ex.ToString());
  }
  finally
  {
    if (_connection.State != ConnectionState.Closed) { _connection.Close(); }
  }

  return null;
}

Есть идеи? Наш администратор баз данных обвиняет фреймворк, я на самом деле обвиняю что-то в SQL .. (может быть, статистика или поврежденная база данных)

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Различия в производительности SQL между .NET и другими клиентами (SQL Management Studio) обычно сводятся к тому, что соединения настраиваются по-разному - частыми виновниками являются ANSI_NULLS;ANSI_PADDING.

Попробуйте посмотреть, как настроено соединение в SQL Management Studio, а затем скопируйте то же самое в приложение .NET.

0 голосов
/ 16 января 2012

Информация, которую вы предоставляете, не содержит достаточно подробностей, чтобы действительно помочь ...

ЕСЛИ SSMS действительно намного быстрее, чем причина, может быть какая-то настройка сеанса / соединения - SSMS использует слегка отличающиеся настройки по сравнениюto .NET.

Некоторые пояснения и подсказки о том, что может быть другим / неправильным и т. д., см. http://www.sommarskog.se/query-plan-mysteries.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...