【发布时间】:2016-11-30 19:57:47
【问题描述】:
我知道如果可能的话,WHERE 子句中必须避免通配符和函数。我的问题是:假设我们必须在其中一个之间进行选择,哪一个在性能方面更好?更具体地说,我有以下两个查询,我想知道一般首选哪种查询:
select FirstName from person.person where FirstName like 'S%'
select FirstName from person.person where LEFT(FirstName,1) = 'S'
PS。我检查了这两个查询的执行时间,在这种特定情况下没有明显差异。以下是执行计划:
这是索引 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;
以下是我发现的有关此问题的一些链接,尽管它们并没有完全回答我的问题:
【问题讨论】:
-
您应该向我们展示您是如何创建索引的。
-
通配符通常只有在字符串开始时才会出现问题(或者它们前面的字符序列开始比较字段的大部分值);除非 RDBMS 对这些函数进行了特殊优化,否则大多数函数的使用都会以表扫描结束。
-
有多少行?
LIKE 'S%'将使用索引(而LIKE '%s')不会。我认为,引擎足够聪明,可以同样处理LEFT... -
@TheEsisia 是的,在这种情况下,假设该字段已被索引;如果该字段没有被索引,那么无论哪种方式都无关紧要。 (编辑:另外,我不确定通配符格言在多大程度上适用于 MSSQL;虽然我熟悉 MSSQL,但我的大部分经验都是在 MySQL 中。)
-
在这种情况下你需要说明
IX_Person_LastName_FirstName_MiddleName是如何定义的
标签: sql sql-server function wildcard