从 WHERE 子句中删除子字符串

Gar*_*y B 2 performance sql-server query-performance

我有一个使用SUBSTRINGWHERE 子句中的函数的存储过程。

SELECT DISTINCT
   ColumnBB,
   ColumnCC
FROM TableAA WITH (NOLOCK)
WHERE SUBSTRING(ColumnAA, 1, 17) = @VariableA;
Run Code Online (Sandbox Code Playgroud)

如何防止此查询的索引扫描并使其快速执行?

Nic*_*mas 5

如果您无法根据db2's answer修改架构,请尝试:

WHERE 
       ColumnAA LIKE @VariableA + '%' 
   AND LEN(@VariableA) >= 17          -- safety check
Run Code Online (Sandbox Code Playgroud)

请注意,如果@VariableA少于 17 个字符,则您可以仅使用LIKE. 例如,'The quick brown fox jumped over the lazy dog.'is LIKE 'The%',但这不满足原始SUBSTRING查询的要求。

Aaron 还提出了一个很好的观点,即DISTINCT可能是最终的罪魁祸首。你为什么把它放在那里?是否应该用适当的唯一索引替换?