询问者
请问下SQL根据记录数的不同写法的一些原理

问题
-
大家好,我是一个开发人员,
我的一个应用里,有这样的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层面具体是怎样做到性能优化的?
全部回复
-
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.
- 已编辑 Will_KongMicrosoft contingent staff 2017年10月20日 3:49
-
同一个查询,根据实际情况选择出合适的垫款计划,而不是定死某个执行计划,这才是一个好的数据库引擎
所以,你最先做的应该是验证查询性能是否最佳,而不是执行计划为什么不一样
- 已建议为答案 Will_KongMicrosoft contingent staff 2017年10月23日 9:47
- 取消建议作为答案 Will_KongMicrosoft contingent staff 2017年10月27日 15:54
- 已建议为答案 Will_KongMicrosoft contingent staff 2017年10月27日 15:54