针对这种情况,最优化的解决方案是什么:
我的查询的WHERE子句是这样的:
WHERE columnX LIKE @Account + '%'
我使用'%'因为@Account可能是'',在这种情况下我想获得所有值。在所有其他情况下,我可以使用equals(=)。
此解决方案未优化,因为我在columnX上有索引,因此我想使用equals(=)。此外,由于性能,使用OR的解决方案是不可接受的。
你有其他推荐吗?我在WHERE子句中尝试使用CASE,但没有找到优化的好解决方案。我们的兼容级别为80,因此无法使用更新的语法。 (不要问为什么:-))
提前TnX!维迪奇
答案 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