Необязательные поля скорости SQL SSRS - PullRequest
0 голосов
/ 07 декабря 2009

Я возвращаю результаты следующего запроса, который слишком долго выполняется. Я не уверен, как устранить параметры where, когда они не используются в SSRS. Все @variables являются строками

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)

Я бы предпочел, чтобы запрос не выполнял пустые поля со знаком '%', но я не был уверен, как их условно исключить из запроса.

Ответы [ 2 ]

1 голос
/ 07 декабря 2009
  1. Убедитесь, что у вас есть соответствующие индексы в базе данных для поддержки вашего запроса. Получите базу данных для выгрузки плана доступа и выясните, к каким таблицам обращаются, используя полное сканирование таблицы, а не индекс. Попробуйте добавить индексы или подсказки, или что-то еще, чтобы избавиться от полного сканирования таблицы.

  2. Если вы используете Oracle или другую базу данных, которая поддерживает функцию NVL, вы можете переписать

.

@Parameter = table.Fieldname OR @Parameter IS NULL

а

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

Я обнаружил, что это может значительно повысить производительность, поскольку вторая формулировка с большей вероятностью позволяет использовать индекс, а первая часто превращается в полное сканирование таблицы.

1 голос
/ 07 декабря 2009

Вы наверняка столкнетесь с некоторыми проблемами с производительностью. Единственный другой способ сделать это - использовать логику IF / ELSE и проверить каждый @ параметр.

Вы проверяете, является ли параметр не нулевым, и добавляет ли он его к предложению where. Это устраняет необходимость в

@Paramer = table.FieldName OR @Parameter IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...