在 sql server 中搜索 LEN() 函数的替代项以进行优化

Posted

技术标签:

【中文标题】在 sql server 中搜索 LEN() 函数的替代项以进行优化【英文标题】:Searching an alternate of LEN() function for optimization in sql server 【发布时间】:2013-08-12 09:49:24 【问题描述】:

我有这样的查询

SELECT firstName
FROM student
WHERE LEN(firstName) > 5

“firstName”列上有一个非聚集索引。

通常建议不要在 WHERE、HAVING 等子句中对表的列使用 SQL 函数。否则sql server 将无法使用索引。

那么有没有替代方法来编写这个查询而不在 firstName 列上使用 LEN()?

【问题讨论】:

如果LEN() 查询很常见,您可以将计算列添加到表中并对其进行索引。 【参考方案1】:

还有其他的写法。例如

SELECT firstName
FROM student
WHERE firstName LIKE '_____%'

但这对索引不再友好了。

您可以使用 LEN(firstName) 创建一个计算列并为其编制索引。

CREATE TABLE student
(
firstName VARCHAR(100),
LenFirstName AS LEN(firstName) 
)

CREATE INDEX IX on student(LenFirstName) INCLUDE (firstName)

SELECT firstName
FROM student
WHERE LEN(firstName) > 5

【讨论】:

@Martin:那么除了在表中创建一个新的计算列之外,没有其他选择吗? @DeepakKumarPadhy - 如果您一直对WHERE LEN(firstName) > 5 感兴趣,那么另一种方法是使用WHERE 条件创建索引视图,但这会不太灵活。无论如何,您需要多久执行一次此类查询?【参考方案2】:

我不知道这是否会有所帮助:

;WITH MyCTE AS
(
    SELECT FirstName,      
           LEN(FirstName) AS NameLength
    FROM student
)
SELECT FirstName
FROM   student 
WHERE  NameLength > 5

【讨论】:

【参考方案3】:

使用 CTE 可能是一种选择

;WITH CTE AS(
SELECT firstName, 
       LEN(firstname) AS NameLength
FROM student
)
SELECT firstname
FROM CTE 
WHERE NameLength > 5

拉吉

【讨论】:

以上是关于在 sql server 中搜索 LEN() 函数的替代项以进行优化的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 高级编程之T-SQL 编程函数

小5聊Sql Server基础之IF ELSE的使用,以及len和substringconvert函数的使用

讲解SQL Server数据库中函数的使用方法有哪些?

sql server charindex函数和patindex函数详解(转)

sql server常用函数常用语句

如何在 SQL Server 数据库中搜索字符串?