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

Sql 返回500万条记录的查询需要多长时间?,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我意识到答案应该是“尽可能少的时间”,但我正在努力学习如何优化数据库,我不知道什么是我的硬件可以接受的时间 首先,我将本地计算机与sql server 2008 express的副本一起使用。我有一个双核处理器,2GB内存和一个64位操作系统(如果有区别的话)。我只使用一个包含6个varchar字段的简单表 起初,我查询数据时没有任何索引。这花费了相当长的时间,所以我取消了,并在表中添加了一个聚集索引(使用PK)。这将时间缩短到1分14秒。我不知道这是否是我能得到的最好的,或者我是否仍然能够进一

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

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

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

我是否受到硬件的限制,或者我是否可以对我的表/数据库/查询执行其他操作以更快地获得结果

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

谢谢

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


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

我想你问错了问题

首先,为什么在本地机器上一次需要这么多文章?你想用它们做什么?我这样问是因为我认为你想把这些数据传输到某个地方,所以你应该测量传输数据需要多长时间

一些建议:

您的应用程序当时不应选择500万条记录。尝试拆分查询并以较小的集合获取数据

更新:

因为你这样做是为了测试,我建议你

  • 从查询中删除
    *
    ——SQL server需要一些时间来解决此问题
  • 将数据放在临时存储中,尝试使用
    视图
    或临时表进行此操作
  • 使用

  • 提高绩效。但即使您只是在测试,我仍然不明白,如果您的应用程序永远不会使用这样的查询,为什么您需要这样的测试仅仅为了测试而测试是对时间的一种不好的利用

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

    最佳优化方式取决于您选择的索引策略。正如上面的许多答案一样,我也会说,对表进行分区有时会有所帮助。而且,在一个时间范围内查询所有十亿记录并不是最好的做法。如果您可以尝试使用迭代进行部分查询,将会得到更好的结果。您可以查看此链接,以消除对Sql server 2008最低要求的疑虑。当您输入500万行数据时,几乎100%都将使用tempdb。您应该尝试通过添加其他文件来优化临时数据库。如果在不同的磁盘上有多个驱动器,则应将表数据拆分为位于不同磁盘上的不同ndf文件。在查询磁盘上的所有数据时,分区没有帮助
    您还可以使用查询提示强制并行MAXDOP,这将提高CPU利用率。确保列包含尽可能少的空值,并重建ur索引和统计数据,我在20秒内完成了550万次。这将占用10万个不同频率的时间表,并对未来25年进行预测。仅进行max scenario testing,但作为一个例子,它证明了您在调度系统中可以达到的速度。

    FYI您可能应该通过插入
    #TEMP
    表来进行测试,而不仅仅是选择它。你肯定会为SSM显示所有5百万行的显示开销买单,这会消耗你的内存,IOTo要加快速度,请尽量避免使用“*”并只索取你想要的数据+1,因为Matt建议只索取你想要的数据。。。例如,如果您只需要一行的id和名称,您可以执行“select id,name from…”操作,我会补充说,优化这些测试中发现的问题(我认为这是运行这些测试的原因)将是更大的时间浪费。我知道这是一篇老文章,但这家伙可能一直在练习并熟悉查询调优。