• 性能优化——SQL语句


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

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

        首先排除第一种想法,在添加信息时,需要进行查询的方法只有一个,查询出记录总数,然后生成新的档案编号。在跟代码的过程中,发现了用的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_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秒之差了。

         

       小结:

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

         

  • 相关阅读:
    实测好用的awvs批量添加任务脚本
    SQL注入漏洞
    CTF-WEB-信息泄露题目总结
    Awvs+nessus docker版本
    禅道12.4.2后台管理员权限Getshell复现
    子域名工具,使用必应搜索引擎
    i春秋第二届春秋欢乐赛-Web-Hello World
    百度杯CTF比赛 九月场-WEB-题目名称:SQL
    文件上传漏洞
    CVE-2019-17625漏洞复现(Rambox 0.6.9版本存储型XSS)
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253759.html
Copyright © 2020-2023  润新知