TSQL优化 - 没有LIKE的WHERE子句

时间:2012-10-18 13:11:42

标签: sql sql-server tsql optimization where

针对这种情况,最优化的解决方案是什么:

我的查询的WHERE子句是这样的:

WHERE columnX LIKE @Account + '%'

我使用'%'因为@Account可能是'',在这种情况下我想获得所有值。在所有其他情况下,我可以使用equals(=)。

此解决方案未优化,因为我在columnX上有索引,因此我想使用equals(=)。此外,由于性能,使用OR的解决方案是不可接受的。

你有其他推荐吗?我在WHERE子句中尝试使用CASE,但没有找到优化的好解决方案。我们的兼容级别为80,因此无法使用更新的语法。 (不要问为什么:-))

提前TnX!

维迪奇

5 个答案:

答案 0 :(得分:2)

你可以试试这个

where columnX = isnull(nullif(@Account, ''), columnX)

答案 1 :(得分:1)

您正在尝试执行两个语义不同的查询;一个拉动所有行,一个拉一行。根据定义,这两个查询将具有两个不同的查询计划。您尝试将它们组合到一个查询中以避免“代码重复”是错误的。 “代码重复”是不是的敌人,复杂性是。答案是为每个方案创建一个存储过程。这不仅允许每个存储过程表示单个查询计划;您还可以按照single responsibility principle

简化您的申请

答案 2 :(得分:0)

这是我们所有人都面临的情况:)

如果你选择喜欢的话,那么你真的无能为力。你的情况并不是最糟糕的,如果你最后只添加%,那么索引很有可能用于搜索。真正的问题是当你在开始时有%,如果使用索引,它将在扫描

另外,请记住索引使用情况也与您选择的列有关。如果你有一个带有ID和Name的表,在名称上有一个索引,并从中选择*,则索引可能不会被使用。

要完成,您可以考虑全文搜索,但它的实现相当复杂

答案 3 :(得分:0)

试试这个

DECLARE @var VARCHAR(10) = '' 
DECLARE @table TABLE ( ID VARCHAR(10) ) 

INSERT INTO @table 
SELECT '11' 
UNION 
SELECT '2' 

SELECT * 
FROM @table 
WHERE ( Len(@var) = 0 OR ID = @var ) 

SET @var = '11' 

SELECT * 
FROM @table 
WHERE ( Len(@var) = 0 OR ID = @var ) 

答案 4 :(得分:0)

在某些版本的SQL Server上,如果使用OPTION(RECOMPILE),则OR不是性能问题。有关详细信息,请参阅http://sommarskog.se/dyn-search-2008.html