VFPOLEDB文件太大

时间:2012-10-30 05:38:25

标签: oledb visual-foxpro

我已经编写了几个查询来读取一些.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分钟! (这只是一行)

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

2 个答案:

答案 0 :(得分:0)

由于“Order by”是查询的基础,而您只是寻找最近的100(因此我的订单是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,那么你现在有200个条目用于那个ID ...为100个条目做这个,你有20,000个条目。这个小集合不是问题,但需要考虑的事情。

答案 1 :(得分:0)

在我看来问题是表没有正确的索引来优化您的查询。鉴于正确的索引,VFP的查询引擎非常非常快。

理想情况下,您在WHERE子句中使用的每个字段都有一个标记。 (这是一个过于简单化,但是一个很好的起点。)