我意识到答案应该是'尽可能少的时间',但我正在努力学习如何优化数据库,我不知道我的硬件可接受的时间是多少。
首先,我使用我的本地计算机和sql server 2008 express的副本。我有一个双核处理器,2GB内存和64位操作系统(如果这有所不同)。我只使用一个包含大约6个varchar字段的简单表。
起初我没有任何索引查询数据。这花了很长的时间,所以我取消并添加了聚集索引(使用PK)到表。这将时间缩短到1分14秒。我不知道这是否是我能得到的最好的,或者我是否还能进一步减少这种情况?
我受限于我的硬件还是我可以对我的表/数据库/查询做些什么来更快地获得结果?
仅供参考我只使用标准的SELECT * FROM来检索我的结果。
谢谢!
编辑:只是为了澄清,我只是为测试目的这样做。我不需要提取所有数据,我只是使用它作为一致的测试,看看我是否可以减少查询时间。
我想我要问的是:除了a)升级硬件和b)添加索引(假设架构已经很好)之外,我还能做些什么来加快我的查询性能?
我想你问的是错误的问题。
首先 - 为什么在本地机器上一次需要这么多文章?你想和他们做什么?
我为什么这么问?我认为这些数据将被转移到某个地方。只有在这个时候你应该测量传输数据的时间。
即使在这种情况下,我也想向你提出建议:
你的申请 不应该 当时选择500万条记录。尝试拆分查询,并部分获取数据。
更新:
正如你所说的那样进行测试,我建议你:
- 去掉
*
从您的查询 - SQL服务器花费一些时间来解决这个问题。
- 尝试将您的数据存储到临时数据存储中。尝试使用
VIEW
或临时表。
- 尝试使用一些 缓存计划在您的服务器上
但我仍然不明白 - 如果您的应用程序不会使用此类查询,为什么还需要此类测试? 仅用于测试的测试是花费不好的时间。
查看查询执行计划。如果您的查询正在进行表扫描,则显然需要很长时间。查询执行计划可以帮助您确定表中需要哪种索引。此外,创建表分区有时可以帮助在数据按条件(通常是日期和时间)进行分区的情况下。
最佳的优化方式取决于您选择的索引策略。正如上面的许多答案,我也会说分区表有时会有所帮助。并不是在一个时间范围内查询所有十亿条记录的最佳做法。如果您可以尝试部分地使用迭代查询,那么会给您带来更多好处。您可以查看此链接以清除对Sql server 2008的最低要求的疑虑 Sql server 2008的最低H / W和S / W要求
在划分500万行时,您几乎100%将线轴转移到tempdb。您应该尝试通过添加其他文件来优化您的临时Db。如果在单独的磁盘上有多个驱动器,则应将表数据拆分为位于单独磁盘上的不同ndf文件。查询磁盘上的所有数据时,parititioning将无济于事
U还可以使用查询提示来强制并行MAXDOP这将增加CPU利用率。确保列包含尽可能少的空值并重建ur索引和统计信息