我有一个Sql-Server-2008数据库,我经常从这个数据库中查询超过3000万个条目(joy!)。不幸的是,这个数据库不能被彻底改变,因为它仍在用于R/D。
当我从这个数据库中查询时,它总是花费很长时间。我的意思是,我还没有足够的耐心等待结果(2分钟后,我不得不取消,以避免将研发部门锁在外面)。即使我使用较短的日期范围(超过几个月),基本上也不可能得到任何结果。我使用来自4个列的请求进行查询,不幸的是,我不得不对另一个表使用内连接(据我所知,这在查询效率方面是非常昂贵的--但这是不可避免的)。此内连接表的条目少于100k。
我想知道的是,是否可以将表组织为默认按日期排序,以减少搜索结果的数量?
如果这是不可能的,有什么我可以做的以减少查询时间?是否有其他有用的信息可以帮助我提出解决方案?
我已经包含了我使用的查询的一个示例:
SELECT DISTINCT N.TestName
FROM [DalsaTE].[dbo].[ResultsUut] U
INNER JOIN [DalsaTE].[dbo].[ResultsNumeric] N
ON N.ModeDescription = 'Mode 8: Low Gain - Green-Blue'
AND N.ResultsUutId = U.ResultsUutId
WHERE U.DeviceName = 'BO-32-3HK60-00-R'
AND U.StartDateTime > '2011-11-25 01:10:10.001'
ORDER BY N.TestName如有任何帮助或建议,欢迎光临!
发布于 2012-01-11 06:56:19
听起来datetime可能是一个基于文本的字段,因此没有使用索引?
你可以尝试下面的方法来看看你的速度有没有提高:
select distinct N.TestName
from [DalsaTE].[dbo].[ResultsUut] U
inner join [DalsaTE].[dbo].[ResultsNumeric] N
on N.ModeDescription = 'Mode 8: Low Gain - Green-Blue'
and N.ResultsUutId = U.ResultsUutId
where U.DeviceName = 'BO-32-3HK60-00-R'
and U.StartDateTime > cast('2011-11-25 01:10:10.001' as datetime)
order by N.TestName将内部连接改为左外部连接也是值得的,因为这些连接偶尔会在没有任何原因的情况下执行得更快(至少有一个我不知道的原因)。
发布于 2012-01-11 06:43:27
您可以根据日期列添加索引,这将缩短查询时间。可以使用alter table命令,也可以使用表设计器。
连接的唯一目的是提供排序吗?如果是这样的话,一件快速尝试的事情就是移除它,看看它有多大的不同--至少这样你就知道把注意力集中在哪里了。
最后,SQL server management studio提供了一些有用的工具,例如可以帮助诊断性能问题的执行计划。祝好运!
发布于 2012-01-11 06:52:50
有许多问题可能会导致查询执行延迟。
索引(主键除外)不会对数据进行重新排序,它们只是创建一个索引(比如phonebook),该索引对许多值进行排序并指向主键。
在看不到数据类型或现有索引的情况下,这很困难,但至少,下面的升序索引可能会有所帮助:
DalsaTE.dbo.ResultsNumeric ModeDescription、ResultsUutId和TestName
DalsaTE.dbo.ResultsUut StartDateTime、DeviceName和ResultsUutId
如果没有上面的索引,就可以完成您给出的示例查询,而不需要对实际的表数据执行任何查找。
https://stackoverflow.com/questions/8811449
复制相似问题