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


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

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

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

我受限于我的硬件还是我可以对我的表/数据库/查询做些什么来更快地获得结果?

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

谢谢!

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

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


5396
2018-04-03 12:58


起源

你应该考虑插入一个 #TEMP 表而不是只选择它。您肯定会为SSMS的显示开销付费以显示所有5m行,并且它会占用您的内存和IO - JNK
要加快速度,请尽量避免使用“*”并只询问您想要的数据 - Matt Gibson
为Matt建议只要求你想要的数据+1 ...例如,如果你想要的只是一行的id和名称,你可以做“选择id,来自...的名字” - joelparkerhenderson


答案:


我想你问的是错误的问题。

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

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

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

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

更新:

正如你所说的那样进行测试,我建议你:

  1. 去掉 * 从您的查询 - SQL服务器花费一些时间来解决这个问题。
  2. 尝试将您的数据存储到临时数据存储中。尝试使用 VIEW 或临时表。
  3. 尝试使用一些 缓存计划在您的服务器上

但我仍然不明白 - 如果您的应用程序不会使用此类查询,为什么还需要此类测试? 仅用于测试的测试是花费不好的时间


9
2018-04-03 13:02



我想补充说,优化那些测试中发现的问题,我认为这是运行它们的原因,这将是更大的浪费时间。 - Samuel Lindblom


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


2
2018-04-03 13:39





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


1
2018-04-12 07:19





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


0
2018-02-07 13:58