【发布时间】:2011-11-24 23:42:04
【问题描述】:
我在 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.
我正在尝试重写查询以仍然获得 number_emails,但在每种情况下,它仍然很慢。
我已尝试创建索引,但无法在 user_email 和 user_cc 上创建索引。这两列都是 ntext 类型,在 sql server 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
)
但是查询仍然需要很长时间才能完成执行。
【问题讨论】:
-
如果你有
LIKE '%foo',也不能在SQL Server中使用索引,所以你是否可以索引列也没关系。
标签: sql-server optimization indexing