我正在开发一个windows applicatiopn,我正在上传一个文本文件。 在该文本文件中有5000行,其中有逗号[,]分隔数据。 我在后端使用oledb连接[MS Access]。 我从文件中提取逗号分隔数据并将其插入数据库。
但正如我所观察到的那样,数据几乎是大约15000-16000条记录。 插入时每秒约有7条记录。
我想提高这个速度。
这取决于我们在后端使用的数据库吗?
sql server 2005可以提高速度而不是MS Access吗?
请帮助我。
请参阅守则:
string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
while ((line = inputData.ReadLine()) != null)
{
subLine = line.Split(',');
/*Taking Unique ID from tradefile table*/
int ID=0;
try
{
da=new OleDbDataAdapter("select max(ID) from tradeFile",con);
DataSet ds=new DataSet();
da.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (ds.Tables[0].Rows[i][0].ToString() == "")
{
}
else
{
ID = int.Parse(ds.Tables[0].Rows[i][0].ToString());
ID++;
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
try
{
string unknown="unknown Fileld";
con.Open();
// int j=subLine.Length;
//for(int i=0;i<subLine.Length;i++)
{
int i = 0;
//int j=subLine.Length;
//int index=subLine.Length-j;
cmd=new OleDbCommand(
"insert into tradeFile values('"+ID+"','"+
subLine[i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
unknown+"')",con);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
//counter++;
}
答案 0 :(得分:3)
您可以通过一次插入多行来提高速度。据我所知,sql-server允许在一个查询中插入1000行,对于DB而不是5-6k查询是5-6个查询。不确定有多少行可以处理ms访问。此外,插入速度当然取决于RDBMS
<强> UPD:强>
很高兴您执行其他查询以获取表的新ID。你真的应该使用autoincrement字段,这是第一个。 第二:您的结果插入查询应如下所示:
insert into tradeFile (field1, field2 ... fieldN)
values (f1value1, f2value1...fNvalue1), (f1value2, f2value2...fNvalu2) etc.
第三 - 您需要记住,您不能一次插入超过N(例如SQL Server中的1000)值,因此您的代码可能会有以下几种:
string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
int values = 0;
const int maxValuesPerInsert = 1000;
string insertQuery = string.empty;
while ((line = inputData.ReadLine()) != null)
{
subLine = line.Split(',');
/*do some work to extract values (lemme call em value1, value2...)*/
if (values < maxValuesPerInsert - 1)
{
insertQuery += string.format("({0}, {1}, {2}),", value1, value2, value3);
values++;
}
else
{
insertQuery += string.format("({0}, {1}, {2})", value1, value2, value3); //just to get rid of last comma
var query = string.format("insert into tradeFile (field1, field2, field 3) values {0}", insertQuery);
/*do your db query*/
insertQuery = string.empty;
values = 0;
}
}
答案 1 :(得分:0)
是的,SQL Server比MSACCESS更快更可靠。
当您使用具有多个连接的当代访问权限或者您有大量工作负载时,请避免对大型数据库使用访问权限(几千条记录可能很难访问)。
SQL Server express就足够了(它是免费的,请参阅此处的限制:http://social.msdn.microsoft.com/Forums/en-US/sqldensetup/thread/0e781eb4-1c27-4777-9bd8-bc9e1ae3e803/)
Antoher“workaround”可能在一个查询中使用多个插入或使用BULK插入(我不确定在访问中是否支持)
答案 2 :(得分:0)
当然,MsSQL服务器使用而不是MS Access将提高速度。 另外我认为你正在为每一行查询。您必须在每个查询中添加几行。这会提高速度。
您使用什么算法来分割文本文件中的数据?
答案 3 :(得分:0)
我想提高这个速度。
你应该查找ADO.NET batching。
基本上,您创建一个DataAdapter(即SqlDataAdapter
,如果您选择SQL Server),您可以在其中指定更新,插入和删除命令,然后将DataAdapter.UpdateBatchSize
属性设置为值大于1(例如尝试1000,看看会发生什么)。
使用适度的硬件,您应该能够插入每秒10,000行,但我会尝试几种不同的批量大小和配置文件。
sql server 2005可以提高速度而不是MS Access吗?
是的,如果需要处理更大的数据集,则应考虑切换到SQL Server。不过,不需要使用2005版; SQL Server 2012 Express是截至2012年的免费版本。
如果您确实要同时插入大量行(例如100,000行),您还可以考虑使用SQLBulkCopy
。 SQLBulkCopy
特别适用于在同一服务器上的不同表之间复制数据的情况。