性能:多个条件WHERE子句,还是动态查询?

时间:2016-08-12 13:01:19

标签: sql sql-server

我有以下问题。我必须在一个包含多个过滤器的非常大的表上进行查询。这些过滤器不是强制性的:也就是说,有时查询必须使用某个过滤器(例如,通过ColumnA),有时则不会。这些过滤器作为参数传递给存储过程(例如,@ filterA,用于ColumnA)。

假设可能的过滤器位于ColumnA,ColumnB,ColumnC和ColumnD上(过滤它们的值是@filterA,...,@ filterD)。如果我不需要应用特定的过滤器,则参数将作为NULL传递。目前,我正在考虑使用“条件”WHERE子句来做这样的事情:

SELECT *
FROM LargeTable
WHERE (@filterA IS NULL OR ColumnA = @filterA)
  AND (@filterB IS NULL OR ColumnB = @filterB)
  AND (@filterC IS NULL OR ColumnC = @filterC)
  AND (@filterD IS NULL OR ColumnD = @filterD)

这是一种可能性,但我想知道它是多么高效,因为我会在每种情况下应用所有这些WHERE子句,并且表格非常大。

是否最好使用动态查询,只有在我实际必须使用它时才应用特定的WHERE子句?像这样:

DECLARE @query varchar(MAX)
SET @query = 'SELECT * FROM LargeTable WHERE ';
IF @filterA IS NOT NULL
BEGIN
   SET @query = CONCAT(@query, 'ColumnA = ', @filterA)
END
IF @filterB IS NOT NULL
BEGIN
   SET @query = CONCAT(@query, 'AND ColumnB = ', @filterB')
END
IF @filterC IS NOT NULL
BEGIN
   SET @query = CONCAT(@query, 'AND ColumnC = ', @filterC')
END
IF @filterD IS NOT NULL
BEGIN
   SET @query = CONCAT(@query, 'AND ColumnD = ', @filterD')
END

EXEC sp_executesql @query 

什么是更好的选择?当我基本上做“WHERE true”时,WHERE子句如何影响性能?动态查询是否会带来性能损失?

由于

1 个答案:

答案 0 :(得分:2)

  

什么是更好的选择?

在您的情况下,我更喜欢动态SQL。

  

当我基本上WHERE时,WHERE true条款如何影响效果?

无论您是否提供参数,都会评估where子句中的所有条件,无论您是否提供参数。

  

动态查询是否会带来性能损失?

如果您在过滤柱上有索引,那么您的动态效果会更好。