SQL速度SSRS可选字段

SQL速度SSRS可选字段,sql,optimization,reporting-services,Sql,Optimization,Reporting Services,我正在返回以下查询的结果,该查询在运行时花费的时间太长。我不知道在SSR中不使用where参数时如何消除它们。所有@变量都是字符串 select S.SBSB_ID, LTRIM(RTRIM(M.MEME_FIRST_NAME)) + ' ' + LTRIM(RTRIM(M.MEME_LAST_NAME)) AS Names, (CASE M.MEME_REL WHEN 'M' THEN 'Subscriber' WHEN 'S' TH

我正在返回以下查询的结果,该查询在运行时花费的时间太长。我不知道在SSR中不使用where参数时如何消除它们。所有@变量都是字符串

select S.SBSB_ID, LTRIM(RTRIM(M.MEME_FIRST_NAME)) + ' ' + 
LTRIM(RTRIM(M.MEME_LAST_NAME)) AS Names,
(CASE M.MEME_REL WHEN 'M' THEN 'Subscriber'
                             WHEN 'S' THEN 'Son'
                             WHEN 'D' THEN 'Daughter'
                             WHEN 'W' THEN 'Wife'
                             WHEN 'H' THEN 'Husband'
                             WHEN 'O' THEN 'Other'
                             ELSE M.MEME_REL END) AS Relation,
(CASE A.PRPR_ID WHEN 'NONASSIGNED' THEN A.CLCL_PA_ACCT_NO
                          ELSE LTRIM(P.PRPR_NAME) END) AS ProvName,
LTRIM(RTRIM(L.CDDL_CUR_STS)) AS Status
FROM CMC_SBSB_SUBSC S INNER JOIN CMC_MEME_MEMBER M 
ON S.SBSB_CK = M.SBSB_CK INNER JOIN CMC_CDDL_CL_LINE L 
ON L.MEME_CK = M.MEME_CK INNER JOIN CMC_PRPR_PROV P 
ON P.PRPR_ID = L.PRPR_ID INNER JOIN CMC_CLCL_CLAIM A 
ON A.CLCL_ID = L.CLCL_ID
WHERE 
S.SBSB_ID LIKE (CASE @subscriberID 
WHEN '' THEN '%' ELSE @subscriberID END) AND
M.MEME_REL IN (@Relation) AND
UPPER(M.MEME_FIRST_NAME) LIKE '%' + 
UPPER(CASE @firstName WHEN '' THEN '%' ELSE @firstName END) + '%' AND
UPPER(M.MEME_LAST_NAME) LIKE '%' + 
UPPER(CASE @lastName WHEN '' THEN '%' ELSE @lastName END) + '%' AND
(L.CGCG_ID IN (@Category) OR L.CGCG_ID = '') AND

(CASE WHEN (@Tooth) = '' THEN L.CDDL_TOOTH_BEG
WHEN ISNUMERIC(@Tooth) = 0 THEN UPPER(@Tooth)
WHEN LEN(@Tooth) = 1 THEN '0' + @Tooth
ELSE @Tooth END) >= L.CDDL_TOOTH_BEG AND

(CASE WHEN (@Tooth) = '' THEN L.CDDL_TOOTH_BEG
WHEN ISNUMERIC(@Tooth) = 0 THEN UPPER(@Tooth)
WHEN LEN(@Tooth) = 1 THEN '0' + @Tooth
ELSE @Tooth END) <= L.CDDL_TOOTH_END AND

S.SBSB_CK IN (select SBSB_CK FROM CMC_MEME_MEMBER 
WHERE MEME_SSN LIKE (CASE @SSN WHEN '' THEN '%' ELSE @SSN END)) AND
M.MEME_BIRTH_DT LIKE (CASE WHEN @DOB IS NULL THEN '%' ELSE @DOB END)

UNION

select S.SBSB_ID, LTRIM(RTRIM(M.MEME_FIRST_NAME)) + ' ' + 
LTRIM(RTRIM(M.MEME_LAST_NAME)) AS Names,
(CASE M.MEME_REL WHEN 'M' THEN 'Subscriber'
                             WHEN 'S' THEN 'Son'
                             WHEN 'D' THEN 'Daughter'
                             WHEN 'W' THEN 'Wife'
                             WHEN 'H' THEN 'Husband'
                             WHEN 'O' THEN 'Other'
                             ELSE M.MEME_REL END) AS Relation,
RTRIM(LTRIM(P.PRPR_NAME)) AS ProvName,
'Purged - ' + H.CLDH_STS AS Status
FROM CMC_SBSB_SUBSC S INNER JOIN CMC_MEME_MEMBER M 
ON S.SBSB_CK = M.SBSB_CK
INNER JOIN CMC_CLDH_DEN_HIST H ON H.MEME_CK = M.MEME_CK
INNER JOIN CMC_PRPR_PROV P ON P.PRPR_ID = H.PRPR_ID
WHERE 
S.SBSB_ID LIKE (CASE @subscriberID 
WHEN '' THEN '%' ELSE @subscriberID END) AND
M.MEME_REL IN (@Relation) AND
UPPER(M.MEME_FIRST_NAME) LIKE '%' + 
UPPER(CASE @firstName WHEN '' THEN '%' ELSE @firstName END) + '%' AND
UPPER(M.MEME_LAST_NAME) LIKE '%' + 
UPPER(CASE @lastName WHEN '' THEN '%' ELSE @lastName END) + '%' AND
(H.CGCG_ID IN (@Category) OR H.CGCG_ID = '') AND

(CASE WHEN (@Tooth) = '' THEN H.CLDH_TOOTH_BEG
WHEN ISNUMERIC(@Tooth) = 0 THEN UPPER(@Tooth)
WHEN LEN(@Tooth) = 1 THEN '0' + @Tooth
ELSE @Tooth END) >= H.CLDH_TOOTH_BEG AND

(CASE WHEN (@Tooth) = '' THEN H.CLDH_TOOTH_BEG
WHEN ISNUMERIC(@Tooth) = 0 THEN UPPER(@Tooth)
WHEN LEN(@Tooth) = 1 THEN '0' + @Tooth
ELSE @Tooth END) <= H.CLDH_TOOTH_END AND

S.SBSB_CK IN (select SBSB_CK FROM CMC_MEME_MEMBER 
WHERE MEME_SSN LIKE (CASE @SSN WHEN '' THEN '%' ELSE @SSN END)) AND
M.MEME_BIRTH_DT LIKE (CASE WHEN @DOB IS NULL THEN '%' ELSE @DOB END)

我希望查询不执行带有“%”的空白字段,但不确定如何有条件地从查询中删除这些字段。

您肯定会遇到一些性能问题。 唯一的其他方法是使用IF/ELSE逻辑并测试每个@Parameter

检查参数是否不为null,如果不为null,则将其添加到where子句中。 这就消除了对

@Paramer = table.FieldName OR @Parameter IS NULL
确保数据库上有适当的索引以支持查询。让数据库转储访问计划,并使用完整表扫描(而不是索引)确定正在访问哪些表。尝试添加索引、提示或其他任何东西来消除完整的表扫描

如果您使用的是Oracle或其他支持NVL功能的数据库,则可以重写

作为


我发现这可以极大地提高性能,因为第二个公式更可能允许使用索引,而第一个公式通常会转移到完整的表扫描中。

我在CMC_MEME_成员的select SBSB_CK中的S.SBSB_CK上面有一个问题,其中MEME_SSN类似CASE@SSN,然后“%”ELSE@SSN结束,我通过允许一个空复选框,并使用下面的建议,使用OR检查空值,如果用户需要在SSN上进行长时间的错误搜索,这将大大加快对所有其他情况的查询,但至少不会影响其他99%的搜索。
@Parameter = table.Fieldname OR @Parameter IS NULL
NVL(@Parameter, table.Fieldname) = table.Fieldname