6

我已经为这个查询等待了一个多小时,所以我知道我可能做错了什么。有没有有效的方法来定制这个查询:?

select RespondentID, MIN(SessionID) as 'SID'
from BIG_Sessions (nolock)
where RespondentID in (
1418283,
1419863,
1421188,
1422101,
1431384,
1435526,
1437284,
1441394,
/* etc etc THOUSANDS */
1579244 )
    and EntryDate between
    '07-11-2011' and '07-31-2012'
GROUP BY RespondentID 

我知道我的日期范围很大,但我无法更改那部分(日期遍布各处)。

另外,原因MIN(SessionID)是因为否则我们会为每个受访者获得许多 SessionID,一个就足够了(它在 ach2a23a-adhsdx123 之类的字母数字 ID 上取 MIN ......并按字母顺序获取第一个)

谢谢

4

2 回答 2

6
  1. 将您的数千个数字放在一个临时表中。
  2. 索引该表中的数字字段。
  3. 索引 BIG_SESSIONS 中的 RespondentID 字段
  4. 加入两个表

例如:

select RespondentID, MIN(SessionID) as 'SID' 
from BIG_Sessions (nolock) 
    inner join RespondentsFilterTable 
        on BIG_SESSIONS.RespondentID = RespondentsFilterTable.RespondentID
where EntryDate between '07-11-2011' and '07-31-2012' 
GROUP BY BIG_Sessions.RespondentID

您也可以将索引添加到 EntryDate 和 SessionID,但如果您经常添加到 big_sessions,这可能会适得其反

通常,您可以通过研究估计的(或如果可能的实际)执行计划来获得有关如何提高查询性能的提示。

于 2012-07-31T22:50:27.480 回答
1

如果 IN 语句中的最小和最大 id 事先已知并且取决于表中有多少 id,那么respondedID > [smallest_known_id-1] AND respondedID < [largest_known_id+1]在 IN 语句之前添加一个将有助于限制问题

于 2012-07-31T23:25:21.820 回答