【发布时间】:2016-12-19 12:11:27
【问题描述】:
我有以下问题。我必须对带有多个过滤器的非常大的表进行查询。这些过滤器不是强制性的:也就是说,有时查询必须使用某个过滤器(例如,在 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 子句如何影响性能?动态查询是否会带来性能损失?
谢谢
【问题讨论】:
-
如果列上有索引,那么动态 SQL 会更好,因为它可以利用索引。
-
虽然我留下了“不要害怕”的网址,但我讨厌动态 sql。这是一个滑坡,是维护的噩梦。最终,我会同时设置并测试它们。索引是一回事。计划重用是另一个(阅读文章)。如果您最终选择动态,请务必评论您选择的原因。
-
基准测试和比较。
-
查看这篇文章,它涵盖了这种确切的查询类型。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries
标签: sql sql-server