1

oledbcommandのオブジェクトを使用してdBase4データベースからデータをフェッチし、それをdatatableにロードしています。ただし、約5〜10分で160レコードをフェッチするには時間がかかりすぎます。私を助けてください。

コード:

 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));
         }
    }
}
4

1 に答える 1

0

実行しているクエリに問題があるとは思えません。クエリが大規模な (数百万/数十億) データ セットをフィルター処理していない限り、これらのクエリを 12 (毎月だと思いますか?) 実行しているにもかかわらず、問題はありません。また、私が書いている間、DataTable を使用する予定はありましたか? 毎月、テーブルにデータを入力してから破棄します。(データベースはたったの 300k しかないとおっしゃっているので、クエリ自体にかなりの時間がかかっているとは考えられません)。

おそらく、ネットワークまたはファイル自体に関係があります。先ほど言ったように、12 個のクエリを実行していますが、それぞれが成功するたびに接続を切断しています。これは、12 のクエリを実行するとともに、12 の接続を確立する必要があることを意味します。実行する必要がある一連のクエリに対して単一の接続を維持できるかどうかを調査する必要があります。

別の可能性はロックです。データベース ファイルは、複数の接続を維持し、異なるユーザーに対して複数のクエリを実行できますか? dbase 製品についてはまったく知りませんが、シングル ユーザー/シングル スレッドの場合、他の人がデータベースを使用していて、しばらくの間あなたをロックアウトしている可能性があります。

データベースをローカル コンピューターにコピーし、ローカル コピーを参照するように接続文字列を変更して、このコードを再度実行してみてください。実行時間が大幅に短縮されれば、ネットワークに何らかの問題があると自信を持って言えると思います。その時点から、(おそらく) 組織内の誰かに助けを求める必要があります。12 の一見単純なクエリに 5 ~ 10 分かかるのは冗談です。

ネットワークが問題の原因である場合は、いくつかの選択肢があります。

  • ネットワーキング/インフラストラクチャ担当者に調査を依頼してください。共有上のディスク、またはネットワーク IO の過負荷である可能性があります。
  • プログラムの開始時に、データベースをマシンにコピーします。これは、読み取りのみを行っており、更新されたデータを必要としない場合にのみ機能します。または、すべてのクエリの最初にローカルにコピーし、ネットワークにのみ書き込みます。これにより、(比較的)新しいデータが維持され、すべての書き込みが正しいことが保証されます。ただし、多くのクエリを実行すると、ファイル全体をコピーするためのネットワーク コストにより、パフォーマンスが低下する可能性があります。
  • より優れたデータベース製品を使用してください (私の推奨事項)。Postgres または MySql (私は Postgres をお勧めします) を使用してデータベース サーバーをセットアップし、dbase データをサーバーに移行し、dbase ファイルを参照するすべてのアプリケーションがデータベース サーバーを指すようにします。複数の接続がデータベースにアクセスする必要がある場合は、実際にこれを行う必要があります。データベースにアクセスする必要がある接続が 1 つだけの場合、データベースはアクセスを実行しているマシン上にある必要があります。
于 2011-03-05T11:39:45.307 に答える