返回500万条记录的查询需要多长时间?

时间:2012-04-03 12:58:27

标签: sql sql-server database sql-server-2008

我意识到答案应该是“尽可能少的时间”,但我正在努力学习如何优化数据库,而且我不知道我的硬件可接受的时间是什么。

首先,我正在使用我的本地计算机和sql server 2008 express的副本。我有一个双核处理器,2GB内存和64位操作系统(如果这有所不同)。我只使用一个包含大约6个varchar字段的简单表。

首先,我在没有任何索引的情况下查询数据。这花了很长的时间,所以我取消并添加了一个聚集索引(使用PK)到表。这将时间缩短到1分14秒。我不知道这是否是我能得到的最好的,或者我是否还能进一步减少这种情况?

我的硬件是否有限制,或者我可以对我的表/数据库/查询做些什么来更快地获得结果?

仅供参考我只使用标准的SELECT * FROM来检索我的结果。

谢谢!

编辑:只是为了澄清,我只是为了测试目的这样做。我不需要提取所有数据,我只是使用它作为一致的测试,看看我是否可以减少查询时间。

我想我要问的是:除了a)升级硬件和b)添加索引(假设架构已经很好)之外,我能做些什么来加快我的查询性能?

5 个答案:

答案 0 :(得分:9)

我认为你问的是错误的问题。

首先 - 为什么在本地机器上一次需要这么多文章?你想用它们做什么?

我为什么要问?我认为这些数据将被转移到某个地方。只有在这个时候你应该测量传输数据的时间。

即使在这种情况下,我也想向你提出建议:

您的应用不应当时选择500万条记录。尝试拆分查询,并部分获取数据。

更新:

正如您所说的那样,我建议您:

  1. 从查询中删除* - SQL Server花费一些时间来解决此问题。
  2. 尝试将您的数据存储到某些临时数据存储中。尝试使用VIEW或临时表。
  3. 尝试使用一些cache plan on your server
  4. 但我仍然不明白 - 如果您的应用程序不会使用此类查询,为什么还需要此类测试? 只进行测试测试是花费的时间

答案 1 :(得分:2)

查看查询执行计划。如果您的查询正在进行表扫描,则显然需要很长时间。查询执行计划可以帮助您确定表中需要哪种索引。此外,创建表分区有时可以帮助在数据按条件(通常是日期和时间)进行分区的情况下。

答案 2 :(得分:1)

最佳优化方式取决于您选择的索引策略。正如上面的许多答案,我也会说分区表有时会有所帮助。并不是在一个时间范围内查询所有十亿条记录的最佳做法。如果您可以尝试部分地使用迭代查询,那么会给您带来更多好处。您可以查看此链接以清除对Sql server 2008 Minimum H/W and S/W Requirements for Sql server 2008

的最低要求的疑虑

答案 3 :(得分:0)

当划分500万行时,你几乎100%将线轴转移到tempdb。您应该尝试通过添加其他文件来优化您的临时Db。如果在单独的磁盘上有多个驱动器,则应将表数据拆分为位于单独磁盘上的不同ndf文件。在查询磁盘上的所有数据时,parititioning将无济于事  U也可以使用查询提示强制并行MAXDOP这将增加CPU利用率。确保列包含尽可能少的空值并重建ur索引和统计信息

答案 4 :(得分:0)

我在20秒内做了550万。这将以不同的频率接收超过10万个时间表,并对未来25年进行预测。只是最大程度的场景测试,但是以调度系统为例证明了您可以达到的速度。