如何使用IN(具有许多数字ID)使这个SQL查询更有效?

Cof*_*fee 6 sql sql-server group-by query-optimization

我已经等了一个多小时了,所以我知道我可能做错了什么.是否有有效的方法来定制此查询:?

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 
Run Code Online (Sandbox Code Playgroud)

我知道我的日期范围很大,但我不能改变那个部分(日期遍布全部).

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

谢谢

pod*_*ska 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
Run Code Online (Sandbox Code Playgroud)

您也可以为EntryDate和SessionID添加索引,但如果您经常添加big_sessions,这可能会在其他地方适得其反

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

  • 注意:如果您反复对同一个项目列表运行查询,这只会有所帮助.如果这是一次性的(对于该列表),如果你进行内联,你的查询将同样快.问题是构建和索引该表将抵消任何一次运行的收益,因此除非您重新使用该表,否则它是不值得的. (3认同)