在 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() 函数的替代项以进行优化的主要内容,如果未能解决你的问题,请参考以下文章
小5聊Sql Server基础之IF ELSE的使用,以及len和substringconvert函数的使用