2009-12-07 12 views
0

我正在返回以下查詢的結果,該查詢在運行時耗時過長。我不確定如何消除SSRS中未使用的參數。所有@variables都是字符串SQL速度SSRS可選字段

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) 

我寧願沒有執行與「%」空白字段的查詢,但不知道如何從查詢有條件地消除它們。

+0

我有一個問題部分上方 「S.SBSB_CK IN(選擇SBSB_CK FROM CMC_MEME_MEMBER WHERE MEME_SSN LIKE(CASE WHEN @SSN '' THEN '%' ELSE @SSN END))AND」,我固定通過允許空校驗並使用下面的建議來檢查OR是否爲空,這顯着加快了對所有其他情況的查詢(如果用戶需要做長時間的不良搜索,他們仍然可以在SSN上,但至少它不會傷害到其他99%的搜索)。 – 2009-12-07 19:18:23

回答

1
  1. 確保你已經得到了數據庫,以支持您的查詢上適當的索引。獲取數據庫以轉儲出訪問計劃,並找出使用全表掃描而不是索引訪問的表。嘗試添加索引或提示或其他來擺脫全表掃描。

  2. 如果您正在使用Oracle或支持NVL函數一些其他的數據庫,你可以重寫

@Parameter = table.Fieldname OR @Parameter IS NULL 

NVL(@Parameter, table.Fieldname) = table.Fieldname 

我發現這可以極大地提高性能,第二製劑更可能允許而第一個經常的不滿轉化全表掃描要使用的索引。

+0

它與sql server 2005 – 2009-12-07 14:43:52

1

你一定會遇到一些性能問題。 唯一的另一種方法是使用IF/ELSE邏輯並測試每個@Parameter。

您檢查參數是否爲空,如果它不是將它添加到where子句。 這省去了

@Paramer = table.FieldName OR @Parameter IS NULL