1

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

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

WHERE columnX LIKE @Account + '%'

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

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

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

提前TnX!

内马尼亚

4

5 回答 5

2

你可以试试这个

where columnX = isnull(nullif(@Account, ''), columnX)
于 2012-10-18T13:17:45.467 回答
1

You are attempting to execute two semantically different queries; one to pull all rows, and one to pull a single row. These two queries will by definition have two different query plans. Your attempt to combine them into one query to avoid "code duplication" is misguided. "Code duplication" is not the enemy, complexity is. The answer is for you to create a stored proc for each scenario. This will not only allow each stored proc to represent a single query plan; you will also simplify your application by following the single responsibility principle.

于 2012-10-18T13:29:16.870 回答
0

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

如果您选择了“赞”,那么您实际上无能为力。你的情况并不是最糟糕的,如果你只在最后加上 %,那么索引很有可能被用于查找。真正的问题是,当您在开始时有 % 时,索引(如果使用)将在扫描中

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

最后,您可以考虑全文搜索,但它的实现相当复杂

于 2012-10-18T13:20:50.697 回答
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 ) 
于 2012-10-18T13:24:21.270 回答
0

在某些版本的 SQL Server 上,如果您使用OPTION(RECOMPILE). 有关详细信息,请参阅http://sommarskog.se/dyn-search-2008.html

于 2012-10-18T13:25:58.603 回答