我正在使用下表(下面包含虚拟数据;实际表也有大约50K记录)
表All_Users
ID, Domain, ReportDate, SamAccountName
1, Win1, 1/7/2013, user1
2, Win1, 1/7/2013, user2
3, Win1, 1/7/2013, user3
4, Win1, 1/14/2013, user1
5, Win1, 1/14/2013, user2
6, Win1, 1/14/2013, user3
7, Win1, 1/21/2013, user1
8, Win1, 1/21/2013, user2
9, Win1, 1/21/2013, user3
10, Win1, 1/21/2013, user4
11, Win1, 1/21/2013, user5
每周,我们都会从AD中获取一个我们上传到SQL Server数据库的摘录(由报告日期列标识)。 目标是能够运行查询以识别为特定日期范围添加的新AD帐户。
E.g, identify new AD accounts added from 1/7/2013 through 1/21/2013
The result should be:
10, Win1, 1/21/2013, user4
11, Win1, 1/21/2013, user5
目前我的查询如下:
SELECT DISTINCT ReportDate, SamAccountName, Domain, ID
FROM dbo.tbl_All_Users
WHERE (NOT (SamAccountName IN
(SELECT SamAccountName
FROM tbl_All_Users
WHERE (ReportDate = '1/7/2013')))) AND (ReportDate = '1/21/2013')
这最初是有效的,但随着表的增长 - 查询已经开始超时(出于显而易见的原因 - 它不是有效的一点)。
有效的方法是什么?我尝试过使用内部联接(正如我在本网站上发布的那样),但我似乎无法让它适合我的具体案例。鉴于我缺乏SQL知识,我似乎无法弄明白。
答案 0 :(得分:1)
在重写查询之前,您应该查看索引的使用。你桌子上有索引吗?如果没有,您可以从ReportDate列的索引开始。
使用该索引可能会获得很大的改进,但随后您可能会有更多机会进行更高级的性能分析。
答案 1 :(得分:1)
SELECT SamAccountName, MIN(ReportDate)
FROM tbl_All_Users
GROUP BY SamAccountName
HAVING MIN(ReportDate) BETWEEN '1/7/2013' AND '1/21/2013'
答案 2 :(得分:1)
您还可以查看查询计划并查看最高成本的位置,还可以建议可以改进特定查询的新索引。数据库调优顾问将更进一步,并建议其他统计数据。请注意,其他索引通常会增加插入和更新的成本。
答案 3 :(得分:0)
问题并不完全清楚 - 您是否希望返回所有用户,除了在这两个范围日期中添加(正如您的查询似乎在做)?
在这种情况下:
;with newlyAdded (select SamAccountName from dbo.tbl_Al_Users
where ReportDate IN ('2012017', '20130121'))
select distinct ReportDate, SamAccountName, Domain, ID
from dbo.tbl_All_Users T
where not exists (select 1 from newlyAdded nA where nA.SamAccountName = T.SamAccountName)