0

いくつかの .dbf ファイルを読み取るために、いくつかのクエリを作成するという課題がありました。ファイルは Visual FoxPro ファイルであり、ここでの大きな問題は、結合の使用を開始したときです。これにより、一時ファイルが非常に大きくなり、最終的に次のようなエラーが発生するためです。

File c:\users\me\appdata\local\temp\00001kjd000a.tmp is too large.

さらに、クエリには非常に長い時間がかかり、これは私が望んでいるものではありません。sqlserver と c# コードを使用してこのデータにアクセスしようとしましたが、非常に遅いです。

データベースのサイズは、約 350mb、100mb、および 10mb です。プロセスを「高速化」するためにこれらのファイルをローカルに持っていますが、これらからのトリプル結合には15分以上かかります...

そして、私は2GBの別のものを使用する必要があることを知っています

私が使用しているコード:

string connStr = @"Provider=VFPOLEDB.1;Data Source=D:\data\B. Mayer Real\;";
            string qryStr = @"
                select top 100 *
                from db1 a, db2 b, db3 c
                where a.id = b.id
                and b.id = c.id
                order by a.id
                ";

            OleDbConnection conn = new OleDbConnection(connStr);

            conn.Open();

            OleDbCommand cmd = new OleDbCommand(qryStr, conn);
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

            DataSet data = new DataSet();

            adapter.Fill(data);

            DataTable table = data.Tables[0];

            foreach (DataRow myDataRow in table.Rows)
            {
                Console.WriteLine("Found data {0}", myDataRow[1]);
            }

            Console.ReadLine();

            conn.Close();

編集:

最大の問題は、単にファイルを通過することです...次のようなことをすると:

SELECT *
FROM [CARATLOCAL]...[lzarb]
where la_nummer = 364999

これにはすでに30秒かかります

このクエリには 38 分かかりました。(1行だけです)

select max(la_datum + convert(datetime, la_time, 108)) as book_datetime, la_nummer, la_index from [CARATLOCAL]...[lzarb]
where la_datum is not null and la_time is not null and la_nummer = 364999
group by la_nummer, la_index
4

2 に答える 2

0

「Order by」がクエリの基礎であり、最新の 100 のみを探しているため (したがって、私の order by は DESCENDING です)、ID だけを PREQUERY として事前クエリし、残りに結合することをお勧めします。など...「ID」列の各テーブルにインデックスがあることを確認してください。

select 
      PreQuery.*, 
      b.*, 
      c.*
   from
      ( select top 100 a.*
           from db1 a
           order by a.ID DESC ) PreQuery
      JOIN db2 b on PreQuery.ID = b.ID
      JOIN db3 c on PreQuery.ID = c.ID

それでも問題が解決せず、「a.ID」が自動インクリメント列のタイプである場合は、max() ID を取得し、そこからさらに削除することをお勧めします。

さらに...テーブル「B」と「C」にIDごとに複数のレコードがある場合、おそらくデカルト結果に遭遇しています...したがって、Bに「A」IDごとに10個のエントリがあり、Cに20個のエントリがある場合同じ「A」IDの場合、その1つのIDに対して200のエントリがあります... 100のエントリに対してこれを行うと、20,000のエントリがあります。その小さなセットの問題ではありませんが、考慮すべきことがあります。

于 2012-10-30T12:41:45.217 に答える
0

問題は、クエリを最適化するための適切なインデックスがテーブルにないことです。VFP のクエリ エンジンは、適切なインデックスがあれば、非常に高速です。

理想的には、WHERE 句で使用される各フィールドにタグを付けます。(これは単純化しすぎていますが、始めるのに適した場所です。)

于 2012-10-31T20:48:49.133 に答える