慢SQL查询,按日期排序表?

时间:2012-01-10 22:27:21

标签: sql performance sql-server-2008 sql-order-by

我有一个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

感谢任何帮助或建议!

3 个答案:

答案 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

如果没有上面的索引,您可以完成您提供的示例查询,而无需对实际表数据执行单个查找。