【发布时间】:2015-10-01 10:52:00
【问题描述】:
我想就以下查询寻求一些帮助。
运行此脚本会导致系统超时。查询太慢了,只需要 5 分钟才能运行 22 条记录。我相信这与“NOT IN”声明有关。我已经在 Stackoverflow 中寻找有关此问题的答案,有些人建议使用 LEFT OUTER JOIN 和 WHERE NOT EXIST,但我似乎无法将其合并到此查询中。
SELECT a.UserId, COUNT(DISTINCT(a.CustomerId)) AS TotalUniqueContact
FROM [UserActivityLog] a WITH(NOLOCK)
WHERE CAST(a.ActivityDatetime AS DATE) BETWEEN '2015-09-28' AND '2015-09-30' AND a.ID
NOT IN (
SELECT DISTINCT(COALESCE(a.activitylogid, 0))
FROM [CustomerNoteInteractions] a WITH(NOLOCK)
WHERE a.reason IN ('20', '36') AND CAST(a.datecreated AS DATE) BETWEEN '2015-09-28' AND '2015-09-30' AND a.UserId IN (SELECT b.Id
FROM [User] b
WHERE b.UserType = 'EpicUser' AND b.IsEpicEmployee = 1 AND b.IsActive = 1)
)
AND a.UserId IN (
SELECT b.Id
FROM [User] b
WHERE b.UserType = 'EpicUser' AND b.IsEpicEmployee = 1 AND b.IsActive = 1)
GROUP BY a.UserId
【问题讨论】:
-
你能在你使用的数据库上添加标签吗..
-
是的,
NOT IN有问题,为什么? ,因为在您的 NOT IN 条件下,SUB QUERY 中有一个 SUB QUERY,也就是说,您有 3 级查询只能在NOT IN中执行,这可能会导致太多时间。 -
您需要使用
INNER JOIN和LEFT JOIN替换您在NOT IN中的子查询。 -
@DyrandzFamador 已经添加了标签。无论如何,我为此使用 SQL Server 2008。
标签: sql sql-server-2008 optimization