2016-08-12 63 views
3

我有以下问题。我必须通过一个包含多个过滤器的非常大的表执行查询。这些过滤器不是强制性的:也就是说,查询有时必须使用某个过滤器(比如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子句如何影响性能?动态查询是否会带来性能损失?

感谢

+1

如果您在列上有索引,那么动态SQL会更好,因为它可以利用索引。 –

+1

http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql – granadaCoder

+0

虽然我留下了“不要害怕”的网址,但我讨厌动态sql。这是一个滑坡,这是一个维护噩梦。最终,我会设置并测试它们。索引是一回事。计划 - 重用是另一种(阅读文章)。如果你最终选择动态,请确保你评论你为什么选择这样做。 – granadaCoder

回答

2

有什么更好的选择?

就你而言,我更喜欢动态SQL。

WHERE子句在我基本上在做WHERE true时如何影响性能?

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

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

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