天天看点

c#和sql中使用事务提升程序效率的比较

1    在数据库中试验

1.1  没有使用事务

代码如下:

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

Code

c#和sql中使用事务提升程序效率的比较

DECLARE @startTime DATETIME

c#和sql中使用事务提升程序效率的比较

SET @startTime=GETDATE()

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

exec('SP_InsertTest')

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

SELECT Eclepse_Time=DATEDIFF(MS,@startTime,GETDATE())

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

----------------------------------------------------------

c#和sql中使用事务提升程序效率的比较

ALTER PROCEDURE [dbo].[SP_InsertTest]

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

AS

c#和sql中使用事务提升程序效率的比较

BEGIN

c#和sql中使用事务提升程序效率的比较

    DECLARE @i INT

c#和sql中使用事务提升程序效率的比较

    SET @i=0

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

    WHILE @i<100000

c#和sql中使用事务提升程序效率的比较

    BEGIN

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

        INSERT INTO InsertTest 

c#和sql中使用事务提升程序效率的比较

        VALUES(@i,'abc','abc','www','123')

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

        SET @i=@i+1

c#和sql中使用事务提升程序效率的比较

    END

c#和sql中使用事务提升程序效率的比较

END

c#和sql中使用事务提升程序效率的比较

插入100000條數據用時71126ms 

插入300000條數據用時215000ms

插入500000條數據用時356190ms  

插入1000000條數據用時785453ms

1.2  使用事务

代码如下:

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

Code

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 没有使用事务

代码如下:

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

Code

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 使用事务

代码如下;

c#和sql中使用事务提升程序效率的比较
c#和sql中使用事务提升程序效率的比较

Code

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这个太慢了.