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 データベースにアップロードします ([レポートの日付] 列で識別されます)。目標は、クエリを実行して、特定の日付範囲に追加された新しい 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

また、クエリ プランを見て、コストが最も高い場所を確認することもできます。また、その特定のクエリを改善できる新しいインデックスが提案される場合もあります。データベース チューニング アドバイザーはさらに一歩進んで、追加の統計情報も提案します。一般に、インデックスを追加すると、挿入と更新のコストが増加することに注意してください。

于 2013-01-16T05:43:00.497 に答える
1

クエリを書き直す前に、インデックスの使用方法を確認する必要があります。テーブルにインデックスはありますか? そうでない場合は、ReportDate 列のインデックスから開始できます。

おそらくそのインデックスで大幅な改善が得られるでしょうが、より高度なパフォーマンス分析を使用すると、より多くの機会が得られる可能性があります.

于 2013-01-14T23:47:51.163 に答える
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

質問は明確ではありません-これら2つの範囲の日付に追加されたものを除くすべてのユーザーを返しますか(クエリが行っているようです)?

この場合:

;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 に答える