我已经编写了几个查询来读取一些.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
答案 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子句中使用的每个字段都有一个标记。 (这是一个过于简单化,但是一个很好的起点。)