性能优化——SQL语句

来源:互联网 发布:ios11降级后数据恢复 编辑:程序博客网 时间:2024/05/22 16:06

    前段时间人事用户提出一个需求:在添加档案时,档案编号自动生成,但是生成的速度很慢。每次进入添加页面时,档案编号总是过几秒才会出来。然后用户要求,让编号在进入该页时就出现。

    刚看到这个问题时,就想到了可能是查询方法的问题。第一是查询过程中出现了差错;第二是从数据库中查数据花费的时间太长。有了思路,就下手去做吧。

    首先排除第一种想法,在添加信息时,需要进行查询的方法只有一个,查询出记录总数,然后生成新的档案编号。在跟代码的过程中,发现了用的sql语句存在一定的问题。如下:

public string QueryBasicFileID()        {                        string sql = "select * from T_BasicInformation";                       List<T_BasicInformation> basicInfo = this.CurrentDal.LoadItems(sql).ToList();                      string countBasic = (basicInfo.Count + 1).ToString("000000");                       string id = DateTime.Now.ToString("yyyyMMdd") + " " + countBasic;            return id;        }
    看完这个方法会发现问题所在,第一是查询总数只需要使用count(*)方法即可,而这里用的是select *  ,这就意味着需要查询到所有的记录信息。从表面上我们可以知道select count(*) 与select * 的速度不一样,那么他们的差别究竟有多大呢?

    在sql Server中监测一下,看看两者的速度到底能够相差多少呢。

    首先使用“ select   *  ” :    

Declare @d Datetime Set @d=GETDATE()select * from T_BasicInformationselect [花费时间]=DATEDIFF(ms,@d,GetDate())
     

     

     而“ select count(*)” 的执行如下:    

Declare @dd Datetime Set @dd=GETDATE()select COUNT(*) from T_BasicInformationselect [花费时间]=DATEDIFF(ms,@dd,GetDate())
      

     通过两者相互对比发现他们的速度会相差至少500倍,当然从执行的结果来看,他们之间的相差也就不过是1秒,可能从直观上来看,相差并不大。但是,细心的会发现,在本系统中使用了底层框架,相对的来说使用底层之后,查询的速度相对于直接使用原生sql会有所降低,如果在加上在程序中运行和使用低效率的语句,那么其相差的速度就不是那1秒之差了。

     

   小结:

      看似相同的一行代码,在不同的环境中所产生的效果是不一样的。所以,任何时候,并不是将功能实现就行了。还需要从程序的性能和用户的体验度上进行考虑。如果只是功能上实现了,效率没有提上去,那么再好的程序也不会受到用户的喜爱。

     

2 0
原创粉丝点击