0

我正在使用下表(下面包含虚拟数据;实际表也有大约 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 数据库(由 Report date 列标识)。目标是能够运行查询以识别为特定日期范围添加的新 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 知识,我似乎无法弄清楚。

4

4 回答 4

1

在重写查询之前,您应该查看索引的使用。表上有索引吗?如果没有,您可以从 ReportDate 列上的索引开始。

您可能会通过该索引获得很大的改进,但随后您可能会有更多机会通过更高级的性能分析。

于 2013-01-14T23:47:51.163 回答
1

您还可以查看查询计划并查看最大成本在哪里,它还可能会建议可以改进特定查询的新索引。数据库调优顾问将更进一步,并建议额外的统计数据。请注意,额外的索引通常会增加插入和更新的成本。

于 2013-01-16T05:43:00.497 回答
1
SELECT SamAccountName, MIN(ReportDate)                    
FROM tbl_All_Users 
GROUP BY SamAccountName
HAVING MIN(ReportDate) BETWEEN '1/7/2013' AND '1/21/2013'
于 2013-01-14T23:50:11.247 回答
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)
于 2013-01-14T23:47:55.500 回答