SQL SERVER中子句的替代方法
我正在运行以下查询,这花费了太多时间:SQL SERVER中子句的替代方法,sql,sql-server,performance,optimization,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'
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');
让我知道我是否可以使用其他内容而不是在子句中。
非常感谢您的帮助。使用要比较的值加入vs临时表。这允许更多的查询优化。确保临时表有一个包含统计信息的索引。使用要比较的值连接vs临时表。这允许更多的查询优化。确保临时表有一个包含统计信息的索引。您需要测量并找到瓶颈。阅读SQL性能不是由您编写文本的方式决定的,优化器将以ti认为合适的方式重新解释它。都是关于存在哪些数据访问路径备选方案。换句话说:索引 发布完整准确的数据模型。发布数据基数(表大小) 我的8号球告诉我你需要:
temp.dbo.COLD(id)
temp.dbo.FIVE(dt)
temp.dbo.COLD(id)
temp.dbo.FIVE(dt)
- 这是您的问题:
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 ( . . . )
在中的中的值列表不太可能与性能瓶颈密切相关——除了它们带来更多行进行处理这一事实之外。我建议采用以下综合指数:
COLD(proc_flag, id)
FIVE(id, dt, cCode, name)
这些是查询的索引,应该有助于提高性能。这是您的查询:
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 ( . . . )
在
中的中的值列表不太可能与性能瓶颈密切相关——除了它们带来更多行进行处理这一事实之外。我建议采用以下综合指数:
COLD(proc_flag, id)
FIVE(id, dt, cCode, name)
这些是用于查询的索引,应该有助于提高性能。b表中是否有其他值可以定义这些cCode值,这些值可以在temp表上的exists子句检查索引中使用。问题似乎就在这里,而不是您在
中使用中的declrre@d date=dateadd(d,-60,cast(GETDATE()as date))
然后使用和b.dt>=d
。这样的代码只对日期求值一次。@kpa6uk:无论您如何编写查询,任何代码都只对GETDATE求值一次GETDATE
a。@RemusRusanu感谢这篇知识文章。然而,我个人认为这个操作将提高代码的可读性。b表中是否有另一个值可以定义这些cCode值,这些值可以在临时表上的exists clauseCheck索引中使用。问题似乎就在这里,而不是您在中使用中的declrre@d date=dateadd(d,-60,cast(GETDATE()as date))
然后使用和b.dt>=d
。这样的代码只对日期求值一次。@kpa6uk:无论您如何编写查询,任何代码都只对GETDATE求值一次GETDATE
a。@RemusRusanu感谢这篇知识文章。然而,我个人认为,这一行动将提高这段代码的可读性。