• sqlserver开事务与不开事务的区别


    昨天在测试一段批量插入记录的数据库操作时,发现开启事务与否对性能影响很大,根据当时的环境,测试有6倍差距.

    分别测试插入500条/5000条/50000条,

    开启事务时分别为480毫秒/4546毫秒/47407毫秒

    不开事务时分别为3100毫秒/30859毫秒/308802毫秒

    这是什么原因呢?仔细分析一下,这个应该跟SqlServer的后台内存管理和数据存取机制相关。

        当我们提交数据到服务器时,SqlServer会按如下顺序进行操作:

            1)复制数据到内存;2)书写操作日志;3)保存数据到磁盘数据文件中。

        这三步操作中,1和2的效率都比较高(内存书写自不必说,日志书写是顺序书写,不需要复杂校验,故也比较快),

        但第三步写入磁盘数据文件的操作就非常耗时间了。(需要验证,更新索引等)

    OK,我们来解释一下两种情况的差别:

    1、当我们在未开启事务的情况下执行一条(仅一次插入)插入语句时,默认SqlServer会对该语句开启事务。

        在语句结束后,会进行一次自动地Commit操作把数据刷新到磁盘数据文件中。

        如果我们循环多次,就会占用更多系统时间。

    2、在开启事务的情况下,我们只有最后一次Commit操作,并且一旦书写操作日志成功,系统就会报告提交成功。(其实此时后台还正在往磁盘数据文件中刷新数据)。

    总结:因为刷新磁盘数据文件是串行化的,因此应该减少Commit的次数,而开启事务是比较好的选择。否则默认事务就要不停的Commit,占用我们宝贵的时间资源。
    附测试代码:
    static void TestBatchInsert()
        {
            using (IConnectionHelper ch = new ConnectionHelper())
            {
                long t = DateTime.Now.Ticks;
                try
                {
                    ch.BeginTransaction();               
                    for (int i = 0; i < 5000; i++)
                    {
                        XML_COMPANYEntity ce = new XML_COMPANYEntity();
                        ce.SetNextMaxValue(ch);
                        ce.XCM_NAME = "Eric.Zhang" + i.ToString();
                        ce.XCM_ADDRESS = "HangZhou" + i.ToString();
                        ce.InsertEntity(ch);
                    }
                    ch.CommitTransaction();
                }
                catch
                {
                    ch.RollbackTransaction();
                    throw;
                }
                TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - t);
                Console.WriteLine(ts.TotalMilliseconds);
            }
        }

  • 相关阅读:
    PING机制
    二叉树基本概念
    哈希表
    各种排序算法的利弊
    Linux的目录文件权限问题
    Redhat 7 安装Samba服务
    Redhat7 搭建vsftpd(三种方式登录)
    Redhat7 Firewalld防火墙
    将Nginx加入service服务中
    Nginx优化
  • 原文地址:https://www.cnblogs.com/qanholas/p/2585678.html
Copyright © 2020-2023  润新知