1 在数据库中试验
1.1 没有使用事务
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
插入100000條數據用時71126ms
插入300000條數據用時215000ms
插入500000條數據用時356190ms
插入1000000條數據用時785453ms
1.2 使用事务
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
ALTER PROCEDURE [dbo].[SP_InsertTest_Tran]
AS
BEGIN
BEGIN TRANSACTION
DECLARE @i INT
SET @i=0
WHILE @i<100000
BEGIN
INSERT INTO InsertTest
VALUES(@i,'abc','abc','www','123')
SET @i=@i+1
END
COMMIT TRANSACTION
IF @@ERROR<>0
ROLLBACK TRANSACTION
END
测试结果如下
插入100000條數據用時36220ms
插入300000條數據用時111826ms
插入500000條數據用時165343ms
插入10000000條數據用時398216ms
小结:
可以看出,时间是随着插入数据条数大致是线性的关系,并且更重要 的,使用了事务后的效率明显要比没有使用要高,
并且还不是高一点点.
2, 程序中测试
2.1 没有使用事务
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
string connectString = @"data source=M204-128/SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandType = CommandType.Text;
try
{
for (int i = 0; i < 100000; i++)
{
command.CommandText = "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";
command.ExecuteNonQuery();
}
}
catch (Exception ex)
{
}
}
测试结果如下:
插入100000條數據用時124765ms
插入500000條數據用時638984ms
2.2 使用事务
代码如下;
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
string connectString = @"data source=M204-128/SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandType = CommandType.Text;
SqlTransaction tran = conn.BeginTransaction();
command.Transaction = tran;
try
{
for (int i = 0; i < 100000; i++)
{
command.CommandText = "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";
command.ExecuteNonQuery();
}
tran.Commit();
}
catch (Exception ex)
{
try
{
tran.Rollback();
}
catch
{
throw new Exception("");
}
}
}
测试结果如下:
插入100000條數據用時86531ms
插入500000條數據用時422562ms
小结:
这个结果并没有上面的那么样的明显,可能与我写和程序有关,但还是可以看出仍有线性关系,并且,效率还是比没有使用
事务要高.
总结:
从上面的比较中可以看出,使用事务的效率还是比不使用事务的来的好,这里没有测试写入数据发生异常时的回滚带来的
效率问题,但我不认为这是个问题,因为为什么要用数据库,数据库就是要保证数据的正确性,有事务你发生异常,可以回滚.
即使在回滚时会有时间消耗.
(C#几天没练,确实也有一点手生了)
顺便说一句,在插入大批量数据时,我有更快的方式,不用什么insert这个太慢了.