如何使 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 错误吗?
你不能
RIGHT
;索引按顺序存储值,因此当您想要搜索带有特定字符的值时,则不能使用索引,因为这不是索引所在的顺序。
最有可能需要使用 RIGHT
是一种设计缺陷,并且您在该列中存储多个不同的值,而不是单个值。您可能应该使用 2(或更多)列作为单独的值。也许您应该有一个名为
bit
的 mypostfix
列,或者您需要可以存储值 varchar
的 'mypostfix'
列。您比我们更清楚您的要求,知道哪个是正确的对于 LEFT
,只需使用
LIKE
,因为 尾随通配符是 SARGable:
SELECT <Your Columns>
FROM dbo.YourTable
WHERE YourColumn LIKE @SearchValue +'%';