可选参数检查where子句

时间:2014-03-17 08:11:32

标签: sql sql-server performance

我有一堆报告参数,因此我的条件检查首先检查参数值是否为空,如果不是则将其与列值进行比较。

        (@dateStart IS NULL OR @dateStart <= BELGE.AccDate)
        AND (@dateEnd IS NULL OR @dateEnd >= BELGE.AccDate)
        AND (@CompanyId IS NULL OR @CompanyId = hrktlr.CompanyId)
        AND ((@onKayitlarDahil = 1 and hrktlr.StatusCode in ('M', 'O')) 
                OR (@onKayitlarDahil = 0 AND hrktlr.StatusCode = 'M'))
        AND (@BizPartnerId IS NULL or CK.BizPartnerId = @BizPartnerId)
        AND (@BizPartnerKodStart is null or @BizPartnerKodStart = '' or @BizPartnerKodStart <= CK.BizPartnerKod)
        AND (@BizPartnerKodEnd is null or @BizPartnerKodEnd = '' or @BizPartnerKodEnd >= CK.BizPartnerKod)
        AND (@BizPartnerType is null or @BizPartnerType=CK.BizPartnerType)

这对于可维护的SQL查询非常有用,但问题是Sql Query Optimizer会为最坏的情况做好准备,而且索引使用情况很糟糕。例如,当我传入BizPartnerId并因此避免BizPartnerId为空检查时,查询运行速度提高了100倍。 因此,如果我继续使用此方法,您可以为Query Planner推荐任何指针,以帮助提高查询性能。

可选参数检查的任何可行替代方案?

1 个答案:

答案 0 :(得分:3)

要停止sql server表单保存子最佳查询计划,可以使用WITH RECOMPILE选项。每次运行查询时都将重新计算查询计划。