none
请问下SQL根据记录数的不同写法的一些原理 RRS feed

  • 问题

  • 大家好,我是一个开发人员,

    我的一个应用里,有这样的SQL,根据订单表userid的记录数写了不同的SQL,如果订单表的某个userid的记录数大于某个值,如3万,查询的sql就没有做参数化,类似这样的例子 :select username,orderid from order where userid = 'qqww'  (qqww这个用户id的订单数大于3万了);
    如果不大于3万,sql就是参数化的写法,如:select username,orderid from order where userid = @userid

    order订单表,大多数的userid的订单量都不多,只有少数是大于3万的;

    大概问了下其他同事,说是可以做到性能优化,请问下这样做的一些原理,在sql server层面具体是怎样做到性能优化的?
    2017年10月20日 2:13

全部回复

  • Hi 黑猫紧张,

       您好!当你第一次执行查询语句时,SQL Server会开始解析此次执行的语句,并且产生执行计划,保存到缓存计划表中,然后开始从物理存储记录表中读取数据,并且存到相应的内存缓存区域。

       当你第二次执行相同的语句时,SQL Server会解析是否执行过相同的语句,如果是的话,就直接调用缓存的执行计划,减少不必要的执行进程,同理,如果查询的语句完全匹配的话,且查询的结果集还在缓存区,那就直接避免从物理磁盘读取记录,达到快速显示查询记录的效果。

    分析语句1:select username,orderid from order where userid = 'qqww' 

    既保存执行计划,又可以缓存结果集。

    分析语句2:select username,orderid from order where userid = @userid

    保存执行计划,但是当参数值改变后,上次的缓存结果集会马上失效。

    Best Regards,

    Will


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月20日 3:49
  • 数量太大后,这个查询优化器认为走索引还不如全表扫描。

    不知道用户什么场景需要返回3w的结果集,是不是程序逻辑有问题?


    family as water

    2017年10月20日 3:57
  • 数量太大后,这个查询优化器认为走索引还不如全表扫描。

    不知道用户什么场景需要返回3w的结果集,是不是程序逻辑有问题?


    family as water

          哦,我的意思是:不是返还3w的结果集,是说如果这个用户的订单数大于3万,查询这个用户关联的数据时,sql的语法就不是参数的形式(至于哪些用户的订单数会大于3万,我们是另外计算出来的),因为有其他条件,查出来的会是几条数据。

    2017年10月20日 5:52
  • 简单的说,有个叫统计信息的东西,记录了不同参数值对应的记录数量,就知道哪些userid对应的订单量多少。(当然,不是绝对准确和实时的)

    根据不同的数据量,SQL Server会选择不同的执行方式。


    想不想时已是想,不如不想都不想。

    2017年10月20日 8:23
    版主
  • 同一个查询,根据实际情况选择出合适的垫款计划,而不是定死某个执行计划,这才是一个好的数据库引擎

    所以,你最先做的应该是验证查询性能是否最佳,而不是执行计划为什么不一样

    2017年10月23日 9:40
  • "且查询的结果集还在缓存区"

    这个表述不太准确。一个页有200条记录,查询的结果集可能只涉及100条记录,那么缓存的是200条记录

    非参数化就是避免重用执行计划,是个好选择

    但愿新的版本能根据参数值二次确定执行路径(也还是能省下解析、编译的消耗)


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    2017年10月28日 5:10