【发布时间】:2012-01-31 05:39:47
【问题描述】:
我有一个使用这些参数的 SQL 查询:
@SearchFor nvarchar(200) = null
,@SearchInLat Decimal(18,15) = null
,@SearchInLng Decimal(18,15) = null
,@SearchActivity int = null
,@SearchOffers bit = null
,@StartRow int
,@EndRow int
变量@SearchFor、@SearchActivity、@SearchOffers 可以为空或不为空。 @SearchInLat 和 @SearchInLng 必须都为 null,或者都具有值。
我不打算发布整个查询,因为它无聊且难以阅读,但 WHERE 子句的形状如下:
( -- filter by activity --
(@SearchActivity IS NULL)
OR (@SearchActivity = Activities.ActivityID)
)
AND ( -- filter by Location --
(@SearchInLat is NULL AND @SearchInLng is NULL)
OR ( ... )
)
AND ( -- filter by activity --
@SearchActivity is NULL
OR ( ... )
)
AND ( -- filter by has offers --
@SearchOffers is NULL
OR ( ... )
)
AND (
... -- more stuff
)
我已经读到这是一种构建查询的糟糕方法 - SqlServer 在制定包含大量此类子句的高效执行计划时遇到了麻烦,因此我正在寻找其他方法来做到这一点。
我看到了两种方法:
- 在我的客户端应用程序中将查询构造为字符串,以便
WHERE子句仅包含相关参数的过滤器。这样做的问题是它意味着不通过存储过程访问数据库,就像目前其他一切一样。 - 更改存储过程,使其检查哪些参数为空,并根据传递的参数执行子过程。这里的问题是,这意味着在 proc 的定义中重复我自己,因此更难维护。
我该怎么办?还是应该像现在这样继续?我为程序设置了OPTION (RECOMPILE),但我听说这在 Server 2005 中无法正常工作。另外,我计划向这个程序添加更多参数,所以我想确保我拥有的任何解决方案都是公平的可扩展。
【问题讨论】:
-
过早的优化是万恶之源。你试过当前的查询吗?它的运行速度够快吗?
-
您也可以在字符串中构建查询,仅在需要时添加到 WHERE 子句,然后执行该字符串。以这种方式执行计划可能仍然存在问题
-
@Jnk 这已经非常慢了,但我在修复它时遇到了很多麻烦。我不希望它在添加更多参数时变得更慢。
标签: sql sql-server sql-server-2005