Excutereader работает очень медленно при получении данных объектом oledbcommand - PullRequest
1 голос
/ 02 марта 2011

Я получаю данные из базы данных dBase4 с помощью объекта команды oledb и загружаю их в datatable.но для получения 160 записей требуется 5-10 минут.Пожалуйста, помогите мне.

Код:

 using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + TrendFilePath + "\\" + Pathname + ";" + @"Extended Properties=dBASE III;"))

 using (OleDbCommand cm = cn.CreateCommand())
 {
    cn.Open();

    for (int L = 0; L <= months; L++)
     {
         DataTable dt_Dbf = new DataTable();
         From_Date = DateTime.ParseExact(frmdate, dateFormat2, provider);
         From_Date = From_Date.AddMonths(L);

         int month = From_Date.Month;
         string year = "1" + From_Date.Year.ToString().Substring(2, 2);

         if (L == 0)
         {

              cm.CommandText = @"SELECT * FROM  128.DBF where DATE_Y =" 
                               + year + " and DATE_M = " + month + " and DATE_D>=" + From_Day + ""; 
              dt_Dbf.Load(cm.ExecuteReader(CommandBehavior.CloseConnection));
         }
    }
}

1 Ответ

0 голосов
/ 05 марта 2011

Я сомневаюсь, что проблема, которую вы выполняете, является проблемой. Если запрос не фильтруется на массивном (миллионы / миллиарды) наборе данных, я не вижу проблем с ним - даже если вы выполняете 12 (я предполагаю для каждого месяца?) Этих запросов. Кроме того, пока я писал, планировали ли вы вообще использовать DataTable? Каждый месяц вы заполняете таблицу, а затем выбрасываете ее. (Поскольку вы упоминаете, что база данных составляет всего ~ 300 тыс., Невозможно, чтобы сами запросы занимали какое-то значительное время).

Вероятно, это как-то связано с сетью или самим файлом. Как я уже сказал, вы выполняете 12 запросов, но разрываете соединение при успешном выполнении каждого из них. Это означает, что вам нужно установить 12 соединений, а также выполнить 12 запросов. Вам следует выяснить, можете ли вы поддерживать одно соединение для набора запросов, которые вам нужно выполнить.

Другая возможность - блокировка. Может ли файл базы данных поддерживать несколько соединений и выполнять несколько запросов для разных пользователей? Я вообще не знаю продукт dbase, но если он однопользовательский / однопоточный, это может быть случай, когда другие люди используют базу данных и на какое-то время блокируют вас.

Попробуйте скопировать базу данных на локальный компьютер, изменив строку подключения, чтобы она ссылалась на локальную копию, и снова запустите этот код. Если время выполнения значительно сократится, я уверен, что вы сможете с уверенностью сказать, что существует какая-то проблема с сетью. С этого момента вам (вероятно) нужно будет обратиться за помощью к кому-то из вашей организации. 5-10 минут на 12, казалось бы, простых запросов - шутка.

Если причиной проблемы является сеть, вы можете воспользоваться несколькими вариантами.

  • Попросите сотрудников сети / инфраструктуры провести расследование. Это может быть диск на общем ресурсе или перегруженный сетевой ввод-вывод.
  • Скопировать базу данных на машину в начале программы. Это будет работать, только если вы только читаете, и вам не нужны обновленные данные. Кроме того, копировать в локальную в начале каждого запроса, и только писать в сеть. Это сохранит (относительно) свежие данные и обеспечит правильность всех записей. Однако, если вы делаете много запросов, сетевая стоимость копирования всего файла, вероятно, будет иметь худшую производительность.
  • Используйте лучший продукт базы данных (моя рекомендация). Настройте сервер базы данных, используя Postgres или MySql (я советую Postgres), перенесите данные dbase на сервер и получите все свои приложения, которые ссылаются на точку файла dbase, на сервер базы данных. Вы действительно должны делать это, если для доступа к базе данных требуется более одного соединения. Если для доступа к базе данных требуется только одно соединение, база данных должна находиться на компьютере, осуществляющем доступ.
...