我正在运行以下查询,这需要花费太多时间:
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子句,请告诉我。 我很感激你的帮助。
答案 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)
这些是覆盖查询的索引,应该有助于提高性能。