在WHERE子句中有哪一个:'wild cards'或'String Functions'?

时间:2016-11-30 19:57:48

标签: sql sql-server function wildcard

我知道如果可能的话,必须在WHERE子句中避免使用通配符和函数。我的问题是:假设我们必须在其中一个之间做出选择,哪个在性能方面还是更好?更具体地说,我有以下两个查询,我想知道一般首选的查询类型:

select FirstName from person.person where FirstName like 'S%'

select FirstName from person.person where LEFT(FirstName,1) = 'S' 

PS。我已经检查了两个查询的执行时间,并且在这个特定情况下没有明显的区别。以下是执行计划:

enter image description here

enter image description here

enter image description here

这是索引的代码 IX_Person_LastName_FirstName_MiddleName 已定义:

USE [AdventureWorks2012]
GO

/****** Object:  Index [IX_Person_LastName_FirstName_MiddleName]       Script Date: 11/30/2016 12:53:05 PM ******/
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName_MiddleName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC,
[MiddleName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO;

以下是我发现的有关此问题的一些链接,但它们并未完全回答我的问题:

AvoidFunctionsInWereClause_1

AvoidFunctionsInWereClause_2

AvoidLikeClause

1 个答案:

答案 0 :(得分:1)

两个查询都在进行索引扫描,所以这些都没问题。但我们不知道您如何设置索引或表格大小。

第一个版本可以在firstName上使用基本索引,因为%在最后。

 FirstName like 'S%'

 FirstName Like '%S%' -- cant use index

第二版 cant 使用firstName上的索引,但您可以为LEFT(FirstName,1)创建计算索引,这就是您应该向我们展示索引的原因。

这篇文章有创建索引的最佳提示。 MySQL索引TIPS