使用 like over charindex 来搜索模式

IT *_*her 1 performance sql-server-2008-r2 pattern-matching

我们在这里使用 charindex 来搜索一个字符串,如下所示

SELECT *
FROM tablename
WHERE ( Charindex('47a%$.abc',CAST(columnname AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)

我打算用 LIKE 替换 charindex,因为我只需要搜索模式是否存在而不是位置。所以我想知道在我的情况下使用 LIKE 而不是 charindex 有什么缺点。我在几种情况下使用 charindex。所以我希望它适用于所有 sql 数据类型,包括特殊字符在内的所有字符(包括 %(就像已经使用了 %pattern%)。所以请告诉我使用 like 超过 charindex 有什么缺点

Mar*_*ith 5

缺点是您需要对模式语法中所有具有特殊意义的字符进行转义。

按照您之前的问题,您进行转义的方式似乎会影响基数估计。

在 SQL Server 2008/2012 上测试

SELECT name
/*Copying into a temp table as on 2012 this table is now in the readonly 
 resource database*/
INTO #T
FROM   master..spt_values
Run Code Online (Sandbox Code Playgroud)

然后

SELECT *
FROM   #T
WHERE  name LIKE '%\%%' ESCAPE '\' 
Run Code Online (Sandbox Code Playgroud)

给出估计的行数625.33/627.575。但

SELECT *
FROM   #T
WHERE  name LIKE '%[%]%' 
Run Code Online (Sandbox Code Playgroud)

给出估计的行数1.8563/1.86296

事实上name,该表中没有任何值包含文字%字符,因此在这种情况下,第二个值似乎更准确。

对此 Connect Item的响应说明

在存在用户定义的转义字符的情况下,我们不支持精确的基数估计。所以我们可能得到一个糟糕的估计和一个糟糕的计划。我们将考虑在未来的版本中解决这个问题。