【问题标题】:Which one is preffered in a WHERE clause: 'wild cards' or 'String Functions'?WHERE 子句中首选哪一个:“通配符”或“字符串函数”?
【发布时间】: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;

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

AvoidFunctionsInWereClause_1

AvoidFunctionsInWereClause_2

AvoidLikeClause

【问题讨论】:

  • 您应该向我们展示您是如何创建索引的。
  • 通配符通常只有在字符串开始时才会出现问题(或者它们前面的字符序列开始比较字段的大部分值);除非 RDBMS 对这些函数进行了特殊优化,否则大多数函数的使用都会以表扫描结束。
  • 有多少行? LIKE 'S%' 将使用索引(而LIKE '%s')不会。我认为,引擎足够聪明,可以同样处理LEFT...
  • @TheEsisia 是的,在这种情况下,假设该字段已被索引;如果该字段没有被索引,那么无论哪种方式都无关紧要。 (编辑:另外,我不确定通配符格言在多大程度上适用于 MSSQL;虽然我熟悉 MSSQL,但我的大部分经验都是在 MySQL 中。)
  • 在这种情况下你需要说明IX_Person_LastName_FirstName_MiddleName是如何定义的

标签: sql sql-server function wildcard


【解决方案1】:

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

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

 FirstName like 'S%'

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

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

这篇文章有创建索引的最佳技巧。 MySQL索引TIPS

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2013-10-17
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2013-08-24
    • 2019-07-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多