我有一个Sql-Server-2008数据库,我正在常规查询超过3000万条目(欢乐!)。不幸的是,这个数据库无法彻底改变,因为它仍然在用于R / D.
当我从这个数据库查询时,它需要FOREVER。我的意思是我没有耐心等待结果(2分钟后我必须取消以避免锁定R / D部门)。即使我使用短日期范围(超过几个月),基本上也不可能从中得到任何结果。我正在查询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
感谢任何帮助或建议!
答案 0 :(得分:2)
您可以根据日期列添加索引,这样可以缩短查询时间。您可以使用alter table命令,也可以使用表设计器。
加入的唯一目的是提供排序吗?如果是这样,一个快速的尝试就是删除它,看看它有多大差异 - 至少那时你会知道在哪里集中注意力。
最后,SQL Server管理工作室提供了一些有用的工具,例如可以帮助诊断性能问题的执行计划。祝你好运!
答案 1 :(得分:2)
听起来,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
尝试将内连接更改为左外连接也是值得的,因为这些偶尔会在没有任何可能原因的情况下执行得更快(至少有一个我不知道)。
答案 2 :(得分:1)
有许多问题可能导致查询执行延迟。
索引(主键除外)不对数据重新排序,它们只是创建一个索引(思考电话簿),该索引对许多值进行排序并指向主键。
没有看到数据类型或现有索引,这很困难,但至少,以下ASCENDING索引可能有所帮助:
[DalsaTE]。[dbo]。[ResultsNumeric] ModeDescription和ResultsUutId和TestName
[DalsaTE]。[dbo]。[ResultsUut] StartDateTime和DeviceName以及ResultsUutId
如果没有上面的索引,您可以完成您提供的示例查询,而无需对实际表数据执行单个查找。