我有一堆报告参数,因此我的条件检查首先检查参数值是否为空,如果不是则将其与列值进行比较。
(@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推荐任何指针,以帮助提高查询性能。
可选参数检查的任何可行替代方案?
答案 0 :(得分:3)
要停止sql server表单保存子最佳查询计划,可以使用WITH RECOMPILE选项。每次运行查询时都将重新计算查询计划。