Sql 优化搜索连接行值的查询

Sql 优化搜索连接行值的查询,sql,Sql,我正在处理一些遗留的SQL代码,并且正在寻找一些帮助来修复我遇到的一个奇怪的查询。看起来是这样的: SELECT * FROM TA LEFT OUTER JOIN TB ON TA.a1 = TB.b3 WHERE TA.a1 LIKE 'usersearch' OR TB.b1 + ':' + TB.b2 LIKE 'usersearch' usersearch是用户提供的正则表达式,在创建查询时未知 usersearch变量在两个相似的部分中都是相同的。这是一段疯狂的代码

我正在处理一些遗留的SQL代码,并且正在寻找一些帮助来修复我遇到的一个奇怪的查询。看起来是这样的:

SELECT * 
FROM   TA LEFT OUTER JOIN TB ON TA.a1 = TB.b3
WHERE  TA.a1 LIKE 'usersearch'
    OR TB.b1 + ':' + TB.b2 LIKE 'usersearch'
usersearch是用户提供的正则表达式,在创建查询时未知

usersearch变量在两个相似的部分中都是相同的。这是一段疯狂的代码,需要花费很长时间才能运行,但我很难想出如何优化它

糟糕的是,它构造了一个字符串,对每一行执行正则表达式。然而,我真的不知道如何避免这种情况


如果有人有什么想法,我很想听听

您的where条件:
TB.b1+':'+TB.b2类似于“usersearch”
是并将始终导致表扫描。您可能需要考虑制作一个持久化的计算列,以便可以对其进行索引。这将提高性能。但是,您的问题表明“usersearch”是一个正则表达式。LIKE不适用于正则表达式。它确实适用于
%
\uu
通配符。我希望这只是一个术语上的错误。如果它真的是一个正则表达式,那么您将需要一个非常不同的解决方案。无论如何,sargable问题仍然需要解决。

首先删除LIKE并替换为
=
。其次,您希望
TB.b1+':“+TB.b2 LIKE'usersearch'
如何匹配(相等)
'usersearch'
?因此,所有这些:
或TB.b1+:“+TB.b2类似于‘usersearch’
都是无用的。因此,一个例子可能是:TB.b1='foo',TB.b2='bar'和usersearch='%foo:bar%'。因此,它应该是像“%foo:bar%”一样的“foo:bar”。
“usersearch”不是一个变量,而是一个字符串文本。如果您没有发布正确的代码,您希望如何获得帮助?我认为您需要解释您希望查询做什么。例如:search如果两个表中都有“usersearch”,或者两个表中都有包含“usersearch”的行,那么我正在考虑按照这些思路做一些事情。非sargable信息也非常有用。另外,关于regex vs like部分,您是正确的。输入只有%和uu通配符,所以这只是一个术语错误。再次感谢!