加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

惊人的SQL速度增加

发布时间:2020-12-12 16:29:33 所属栏目:MsSql教程 来源:网络整理
导读:我刚刚发现,以下两个select语句之间的执行计划性能差别很大: select * from your_large_tablewhere LEFT(some_string_field,4) = '2505'select * from your_large_tablewhere some_string_field like '2505%' 执行计划分别为98%和2%.位的速度差.当我看到它
我刚刚发现,以下两个select语句之间的执行计划性能差别很大:
select * from your_large_table
where LEFT(some_string_field,4) = '2505'

select * from your_large_table
where some_string_field like '2505%'

执行计划分别为98%和2%.位的速度差.当我看到它时,我真的很震惊.

我一直在做好LEFT(xxx)=’yyy’,因为它读得很好.
我实际上通过检查LINQ生成的SQL来反对我的手工制作的SQL.我假设LIKE命令会更慢,但实际上要快得多.

我的问题是为什么LEFT()慢于LIKE’%..’.他们是相同的?

还有,使用LEFT()是否有CPU命中?

解决方法

更一般来说,您不应该在查询中的WHERE子句的左侧使用函数.如果这样做,SQL将不使用索引 – 它必须对表的每一行进行评估.目标是确保你的where子句是“ Sargable”

其他一些例子:

Bad: Select ... WHERE isNull(FullName,'') = 'Ed Jones'
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))

Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'
Fixed: Select ... WHERE DealerName Like 'Ford%'

Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate()) 

Bad: Select ... WHERE Year(OrderDate) = 2003
Fixed: Select ... WHERE OrderDate >= '2003-1-1' AND OrderDate < '2004-1-1'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读