替代IN子句SQL SERVER

时间:2014-11-24 09:34:19

标签: sql sql-server performance optimization

我正在运行以下查询,这需要花费太多时间:

select a.id, b.name 
from temp.dbo.COLD a with (NOLOCK)
inner join temp.dbo.FIVE b with (NOLOCK)
on a.id = b.cid
where a.proc_flag ='C'
and b.dt >= dateadd(D,-(cast('60' as int)),cast(GETDATE() as date))
and b.cCode in 
(
'ADC',
'BUNE',
'DD',
'HUUP',
'INER',
'MNER',
'NCIT',
'NOG',
'TRON',
'WRUM',
'XFNA',
'BL', 
'DIO', 
'DOM', 
'HU',
'ILL',
'INKT',
'LB',
'NOM',
'PE',
'RF',
'SE',
'XER',
'Pge',
'dd',
'CC');

如果我可以使用其他内容而不是IN子句,请告诉我。 我很感激你的帮助。

3 个答案:

答案 0 :(得分:3)

使用您要比较的值加入临时表。这允许更多的查询优化。确保临时表具有带统计信息的索引。

答案 1 :(得分:1)

您需要衡量并找到瓶颈。阅读How to analyse SQL Server performance。 SQL性能不是由您编写文本的方式驱动的,优化器无论如何都会重新解释它。是关于什么数据访问路径替代品存在。换句话说:索引

发布完整准确的数据模型。发布数据基数(表格大小)。

NOLOCK results are incorrect results

我的8球告诉我你需要:

  • temp.dbo.COLD(id)
  • 上的(可能是群集的)索引
  • temp.dbo.FIVE(dt)
  • 上的聚集索引

答案 2 :(得分:0)

这是您的查询:

select a.id, b.name 
from temp.dbo.COLD a with (NOLOCK) inner join
     temp.dbo.FIVE b with (NOLOCK)
     on a.id = b.cid
where a.proc_flag = 'C' and
      b.dt >= dateadd(D,-(cast('60' as int)),cast(GETDATE() as date)) and
      b.cCode in ( . . . )

in中的值列表极不可能与性能瓶颈密切相关 - 除了它们引入更多行进行处理之外。我建议使用以下复合索引:

COLD(proc_flag, id)
FIVE(id, dt, cCode, name)

这些是覆盖查询的索引,应该有助于提高性能。