前段时间人事用户提出一个需求:在添加档案时,档案编号自动生成,但是生成的速度很慢。每次进入添加页面时,档案编号总是过几秒才会出来。然后用户要求,让编号在进入该页时就出现。
刚看到这个问题时,就想到了可能是查询方法的问题。第一是查询过程中出现了差错;第二是从数据库中查数据花费的时间太长。有了思路,就下手去做吧。
首先排除第一种想法,在添加信息时,需要进行查询的方法只有一个,查询出记录总数,然后生成新的档案编号。在跟代码的过程中,发现了用的sql语句存在一定的问题。如下:
public string QueryBasicFileID()
{
string sql = "select * from T_BasicInformation";
List 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_BasicInformation
select [花费时间]=DATEDIFF(ms,@d,GetDate())
而“ select count(*)” 的执行如下:
Declare @dd Datetime Set @dd=GETDATE()
select COUNT(*) from T_BasicInformation
select [花费时间]=DATEDIFF(ms,@dd,GetDate())
通过两者相互对比发现他们的速度会相差至少500倍,当然从执行的结果来看,他们之间的相差也就不过是1秒,可能从直观上来看,相差并不大。但是,细心的会发现,在本系统中使用了底层框架,相对的来说使用底层之后,查询的速度相对于直接使用原生sql会有所降低,如果在加上在程序中运行和使用低效率的语句,那么其相差的速度就不是那1秒之差了。
小结:
看似相同的一行代码,在不同的环境中所产生的效果是不一样的。所以,任何时候,并不是将功能实现就行了。还需要从程序的性能和用户的体验度上进行考虑。如果只是功能上实现了,效率没有提上去,那么再好的程序也不会受到用户的喜爱。