Tsql 同样的执行计划?

Tsql 同样的执行计划?,tsql,sql-execution-plan,Tsql,Sql Execution Plan,我正在学习成为一名数据库管理员,在这样做的过程中,我想学习更多关于调优查询的知识。我能理解的最多,但我想知道为什么这两个查询具有相同的执行计划,甚至以两种不同的方式编写。这些基于adventureworks2012lt数据库 select productnumber, name, listprice from saleslt.product where productnumber like 'bk-[a-q,s-z]%' and productnumber like '%-[0-9][0-9]

我正在学习成为一名数据库管理员,在这样做的过程中,我想学习更多关于调优查询的知识。我能理解的最多,但我想知道为什么这两个查询具有相同的执行计划,甚至以两种不同的方式编写。这些基于
adventureworks2012lt
数据库

select productnumber, name, listprice 
from saleslt.product
where productnumber like 'bk-[a-q,s-z]%' and productnumber like '%-[0-9][0-9]'


SELECT ProductNumber, Name, ListPrice
FROM SalesLT.Product 
WHERE ProductNumber LIKE 'BK-[^R]%-[0-9][0-9]';

我还不能发布照片,因为我的代表还不够高:(

假设您正在手动浏览产品目录,查找指定模式的产品编号。这些产品没有按任何顺序进行排序。除了逐个检查所有产品并进行匹配之外,您还有什么选择?您在
产品编号上没有索引。
。SQL Server别无选择,只能使用表scan以查找匹配的行

但是,如果将索引添加到
ProductNumber
,会发生什么情况?结果无论如何都是一样的。以
%
开头的模式无法使用索引。因此,第一个查询将跳转到以
BK
开头的索引中的范围。第二个查询也是如此


新来者沉迷于提高效率。随着时间的推移,你将学会将事情交给SQL Server处理。你只应该在事情成为问题时才担心。唯一的例外是游标。如果你考虑使用游标解决问题,90%的时候都是错误的方法。

它们甚至是相同的逻辑读物:(54行受影响)表“产品”。扫描计数1,逻辑读取103,物理读取0,预读0,lob逻辑读取0,lob物理读取0,lob预读0。(1行受影响)(54行受影响)表“产品”。扫描计数1,逻辑读取103,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。(1行受影响)我只想说,SQL server引擎比您想象的要聪明。两个类似于使用通配符搜索productnumber的搜索,您会惊讶于它有相同的执行计划?我想补充几点1)数据库的productnumber列上确实有一个唯一的非聚集索引。这意味着您应该更高效地执行第二个查询,因为当like子句以“%”开头时,您不能使用索引。2)我认为,在查询成为问题之前,您不应将其置之不理。毕竟,您可能会为一个查询制定一个有效的执行计划,当您更改变量时,这将是一个糟糕的执行计划。(也称为代码覆盖率差和参数嗅探)“过早优化是万恶之源”--Donald Knuth。了解编写良好查询的良好实践,然后将其余部分留给数据库。在一些边缘情况下,您的查询速度会慢到很低。我不在乎查询是否从1跳到2(增加100%)直到业务部门说这是一个问题。我最好把我的精力花在其他地方。请注意你的第一点:是的,第一个查询中的第二个条件是可以接受的,但第一个条件是可以接受的。因此两个查询都将跳转到以BK开始的范围,并从那里继续。接下来会发生什么很难说:评估2个简单的co是否更有效条件还是复杂条件?要得到明确的答案,需要在数百万行上对其进行基准测试,然后差异可能太小,根本不重要。