У меня есть запрос в Sql Server, который я хотел бы оптимизировать.
SELECT user_type_name = CASE user_type_id
WHEN 1 THEN 'Admin'
WHEN 5 THEN 'Super Admin'
WHEN 3 THEN 'Writer'
WHEN 4 THEN 'Reader'
END,
user_can_log = CASE user_inactive
WHEN 1 THEN 'No'
ELSE 'Yes'
END,
(SELECT COUNT(*)
FROM t_fthread
WHERE fthread_creator_userid = user_id) AS number_tickets,
(SELECT COUNT(*)
FROM t_email
WHERE email_to LIKE '%' + user_email + '%'
OR email_cc LIKE '%' + user_email + '%') AS number_emails,
*
FROM t_user
LEFT JOIN t_organisation
ON user_org_id = organisation_id
WHERE user_org_id = 42
ORDER BY user_last_name,
user_first_name
Выполнение запроса занимает слишком много времени.Благодаря анализатору запросов, я определил часть запроса, которая занимает слишком много времени. Вот этот раздел:
(select count(*) from t_email where email_to like '%'+user_email+'%' or email_cc like '%'+user_email+'%') as number_emails.
Я пытаюсь переписать запрос, чтобы получить число_почт, но в каждом случаеЭто все еще очень медленно.
Я пытался создать индексы, но невозможно создать индексы для user_email и user_cc.Оба столбца относятся к типу ntext, и на сервере sql 2000 невозможно создать индекс для этих столбцов.Я запустил анализ запроса с помощью помощника по настройке ядра СУБД и выполнил рекомендации, предоставленные инструментами.
CREATE NONCLUSTERED INDEX [_dta_index_t_fthread_15_2073058421__K5] ON [dbo].[t_fthread]
(
[fthread_creator_userid] ASC
)
CREATE STATISTICS [_dta_stat_1365579903_4_3] ON [dbo].[t_user]([user_last_name], [user_first_name])
CREATE STATISTICS [_dta_stat_1365579903_1_5] ON [dbo].[t_user]([user_id], [user_org_id])
CREATE NONCLUSTERED INDEX [_dta_index_t_user_15_1365579903__K5_K1] ON [dbo].[t_user]
(
[user_org_id] ASC,
[user_id] ASC
)
Но запрос все еще занимает много времени, чтобы завершить выполнение.