我刚刚发现,以下两个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'
原文地址:https://www.jb51.cc/mssql/82373.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。