2010-01-10 47 views
1

我正在使用SQL Server 2005 Express,并且遇到了一个奇怪的问题。我有一个名为“DailyPrice”的表格,它有大约2400万条记录(我能够制作这张表感谢您在此主题中的所有帮助:SQL Server 2005 slows down as I keep adding rows当我使用“where”时SQL Server查询冻结

现在,我在VB中运行了一个不同的奇特功能。 NET,我需要根据股票代码(仅1)获取条目列表,并且我需要它们从最旧到最新组织。

此查询的工作:

SELECT  Ticker, DateStamp, ClosePrice 
FROM   DailyPrice 
WHERE  (Ticker = 'DD') 

这一个或者是痛苦的缓慢,我得到一个超时错误:

SELECT  Ticker, DateStamp, ClosePrice 
FROM   DailyPrice 
WHERE  (Ticker = 'DD') 
ORDER BY DateStamp 

字段北京时间和日期戳是我的主索引,在重要的情况下, 。 为什么当我使用ORDER BY时会减慢速度?几个小时前,问题查询进行得很快,但只有一次 - 现在我被超时困扰。

+0

索引中的DateStamp和Ticker的顺序是什么?他们有多选择? – 2010-01-10 02:23:26

+0

当我打开PK_DailyPrice的索引属性时,它首先有DateTime然后它有Ticker,都是递增的(如果那很重要?) – 2010-01-10 02:34:53

+0

我刚刚打开了PK_DailyPrice的碎片属性,它说Total Fragmentation是98.79% - 这不好吗? – 2010-01-10 02:35:44

回答

1

更新您的统计信息或重建您的索引。

这将重新索引整个数据库(注意如果数据库是非常大的!):

exec sp_msforeachtable "dbcc dbreindex('?')" 
+0

这会解释为什么问题是间歇性的吗?它大约在2分钟前再次“快速”,现在它慢慢变废为宝,再次超时。对于索引重建 - 我会在哪里查找相关信息?只需删除我目前的索引并重新创建它? – 2010-01-10 02:25:36

+0

实际上这些症状听起来更像一个错误缓存的查询计划。 – 2010-01-10 02:26:19

+0

...但是由于过时的统计数据也会发生这种情况。 – 2010-01-10 02:26:52

0

查询与ORDER BY将始终需要更长的时间比不使用查询返回。这是因为SQL Server必须首先获取所有记录,然后才能将结果返回给客户端。

您可以通过添加与您在ORDER BY和WHERE子句中使用的字段相匹配的索引来加速查询。但要小心,索引太多会导致插入/更新速度变慢,并且SQL Server可能会决定使用错误的索引。

您可以将索引指定为FROM子句中表提示的一部分,但这会使您的查询依赖于该索引的存在。

最后,在一张表中有24 + mil的记录总是会引起问题。我建议你考虑划分你的表格,特别是如果你能找到一个将数据拆分成几个相似大小的小数据集的领域。 Look at SQL Server Books online for more info on partitioning