我有以下问题。我必须通过一个包含多个过滤器的非常大的表执行查询。这些过滤器不是强制性的:也就是说,查询有时必须使用某个过滤器(比如ColumnA),有时候不会。这些过滤器作为参数传递给存储过程(例如,@filterA,用于ColumnA)。性能:多个条件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子句如何影响性能?动态查询是否会带来性能损失?
感谢
如果您在列上有索引,那么动态SQL会更好,因为它可以利用索引。 –
http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql – granadaCoder
虽然我留下了“不要害怕”的网址,但我讨厌动态sql。这是一个滑坡,这是一个维护噩梦。最终,我会设置并测试它们。索引是一回事。计划 - 重用是另一种(阅读文章)。如果你最终选择动态,请确保你评论你为什么选择这样做。 – granadaCoder