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 分钟!(只有一行)

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,那么您现在拥有该 ID 的 200 个条目...对 100 个条目执行此操作,您将拥有 20,000 个条目。这么小的一套不是问题,而是需要考虑的事情。

于 2012-10-30T12:41:45.217 回答
0

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

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

于 2012-10-31T20:48:49.133 回答