我有一个问题,需要对一个非常大的表进行查询,并使用多个过滤器。这些过滤器不是必需的:也就是说,有时候查询将使用某个过滤器(比如ColumnA),有时候则不会。这些过滤器作为参数传递给存储过程(例如,@filterA表示ColumnA)。
假设可能的过滤器是ColumnA、ColumnB、ColumnC和ColumnD(以及要过滤它们的值@filterA、...、@filterD)。如果我不需要应用特定的过滤器,则将参数传递为NULL。目前,我正在考虑使用“条件”WHERE子句来完成以下操作:
假设可能的过滤器是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子句如何影响性能?动态查询是否会带来性能损失?
谢谢