我想知道是否有任何明智的方法来重写以下查询,以便优化器使用列上的索引?
CREATE PROCEDURE select_Proc1
@Key1 int=0,
@Key2 int=0
AS
BEGIN
SELECT key3
FROM Or_Table
WHERE (@key1 = 0 OR Key1 = @Key1) AND
(@key2 = 0 OR Key2 = @Key2)
END
GO
根据这篇文章如何优化使用Preethiviraj Kulasingham 的参数时“OR”子句的使用:
即使
WHERE
子句中的列被索引覆盖,SQL Server 也无法使用这些索引。这就提出了一个问题,是否有任何东西“阻止”了索引的使用?这个问题的答案是肯定的——罪魁祸首是参数和OR
条件。参数不包含在索引中,这意味着 SQL Server 不能使用任何索引来评估
@key1=0
(这个条件也适用于@key2=0
)。实际上,这意味着 SQL Server 不能使用索引来评估子句
@key1=0 OR Key1= @key1
(因为OR
子句是两个条件所涵盖的行的并集)。同样的原则也适用于其他条款(re.key2)。这导致 SQL Server 得出结论,没有索引可用于提取行,让 SQL Server 使用下一个最佳方法 - 聚集索引扫描
如您所见,如果谓词在子句中被OR
ed,SQL 优化器将不会对列使用索引。WHERE
此问题的一种解决方案是将IF
所有可能的参数组合的查询与子句分开。
现在我的问题是——如果可能的组合不止三个或四个,我们应该怎么做?为每个组合编写单独的查询似乎不是一个合理的解决方案。
这个问题还有其他解决方法吗?