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

SQL查询速度慢,按日期排序表?,sql,performance,sql-server-2008,sql-order-by,Sql,Performance,Sql Server 2008,Sql Order By,我有一个Sql-Server-2008数据库,我经常从中查询超过3000万个条目(joy!)。不幸的是,这个数据库不能被彻底更改,因为它仍然在用于R/D 当我从这个数据库中进行查询时,它会花费很长时间。我的意思是,我没有足够的耐心等待结果(2分钟后,我不得不取消,以避免锁定研发部门)。即使我使用的日期范围很短(超过几个月),也基本上不可能从中得到任何结果。我正在查询其中4列的需求,不幸的是,我不得不对另一个表使用内部联接(我被告知这在查询效率方面非常昂贵——但这是不可避免的)。此内部联接表的条目

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

任何帮助或建议都将不胜感激

您可以根据日期列添加索引,这样可以缩短查询时间。您可以使用ALTERTABLE命令,也可以使用表格设计器

联接的唯一目的是提供排序吗?如果是这样的话,一个快速的尝试就是移除这个,看看它有多大的不同——至少你会知道把注意力集中在哪里


最后,SQLServerManagementStudio提供了一些有用的工具,例如可以帮助诊断性能问题的执行计划。祝你好运

您可以根据日期列添加索引,这样可以缩短查询时间。您可以使用ALTERTABLE命令,也可以使用表格设计器

联接的唯一目的是提供排序吗?如果是这样的话,一个快速的尝试就是移除这个,看看它有多大的不同——至少你会知道把注意力集中在哪里


最后,SQLServerManagementStudio提供了一些有用的工具,例如可以帮助诊断性能问题的执行计划。祝你好运

有许多问题可能会导致查询执行延迟

索引(主键除外)不会对数据进行重新排序,它们只会创建一个索引(想想电话簿),该索引对许多值进行排序并指向主键

如果看不到数据类型或现有索引,这很困难,但至少以下升序索引可能会有所帮助:

[DalsaTE].[dbo].[ResultsNumeric]ModeDescription和ResultsUtid及TestName

[DalsaTE].[dbo].[RESULTSUT]StartDateTime和DeviceName以及RESULTSUTID


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

有许多问题可能会导致查询执行延迟

索引(主键除外)不会对数据进行重新排序,它们只会创建一个索引(想想电话簿),该索引对许多值进行排序并指向主键

如果看不到数据类型或现有索引,这很困难,但至少以下升序索引可能会有所帮助:

[DalsaTE].[dbo].[ResultsNumeric]ModeDescription和ResultsUtid及TestName

[DalsaTE].[dbo].[RESULTSUT]StartDateTime和DeviceName以及RESULTSUTID


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

听起来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

还值得尝试将内部连接更改为左外部连接,因为它们偶尔会因为不可想象的原因(至少有一个我不知道的原因)而执行得更快。

听起来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

还值得尝试将内部联接更改为左外部联接,因为它们有时会由于不可想象的原因(至少我不知道其中一个原因)而执行得更快。

您需要一个解释计划,或者至少让我们知道哪些字段被索引。您是否有索引或您订购的字段上的任何内容,这包括TestName?你需要一个解释计划,或者至少让我们知道哪些字段被索引。你在字段上有索引或任何你订购的东西吗,包括TestName?确定日期似乎可以改善查询的命中率和未命中率。这很好。谢谢选择日期似乎可以提高查询的命中率和未命中率。这很好。谢谢谢谢你的帮助!我已经将索引添加到Uut表中,但不幸的是,由于超时,我似乎无法将任何索引添加到数值表中。你知道怎么调整吗?(我想索引3000万条记录需要一段时间)在选项下,执行超时似乎是无限的。谢谢你的帮助!我已经将索引添加到Uut表中,但不幸的是,由于超时,我似乎无法将任何索引添加到数值表中。你知道怎么调整吗?(我想索引3000万条记录需要一段时间)在选项下,执行超时似乎是无限的。