SQL 中 RIGHT/LEFT 的可控制性

问题描述 投票:0回答:1

如何使 SQL 中的

LEFT
RIGHT
函数可控制?

我的 T-SQL Lint (v1.15.3.0) 在以下代码中产生错误:

SELECT DISTINCT B.BookID
FROM #Books B
WHERE RIGHT(B.[Name], 10) = '-mypostfix';
error non-sargable : Performing functions on filter clauses 
or join predicates can cause performance problems.

我使用了

RIGHT
函数来避免在字符串开头使用通配符(例如
LIKE %-mypostfix
),这似乎会降低性能。然而,经过一些研究,我发现 SQL 在使用通配符时可以利用其搜索索引。
LEFT
RIGHT
强制数据库查看每一行。尽管如此,我相信
RIGHT
应该更快,特别是对于有些长的字符串。

我真的需要使用通配符策略来避免这个 linter 错误吗?

sql t-sql query-optimization static-analysis
1个回答
1
投票

你不能

RIGHT
;索引按顺序存储值,因此当您想要搜索带有特定字符的值时,则不能使用索引,因为这不是索引所在的顺序。 最有可能需要使用

RIGHT

是一种设计缺陷,并且您在该列中存储多个不同的值,而不是单个值。您可能应该使用 2(或更多)列作为单独的值。也许您应该有一个名为

bit
mypostfix
列,或者您需要可以存储值
varchar
'mypostfix'
列。您比我们更清楚您的要求,知道哪个是正确的
对于 

LEFT

,只需使用

LIKE
,因为
尾随
通配符是 SARGable: SELECT <Your Columns> FROM dbo.YourTable WHERE YourColumn LIKE @SearchValue +'%';

© www.soinside.com 2019 - 2024. All rights reserved.