【问题标题】:How can bcp write simple query results to disk faster than SSMS can run the same query?bcp 如何比 SSMS 更快地将简单查询结果写入磁盘?
【发布时间】:2014-01-10 02:51:21
【问题描述】:

运行以下命令花费了10.922 秒:

bcp "select * from PRMTAJ_Reporting..PINVDET 
     where pnd_date between 77500 and 77600" queryout Test.dat -S . -T -n

但是,在 SSMS 中运行相同的精确选择查询需要 28 秒。此外,我在 bcp 命令之后在 SSMS 中运行了查询,因此我首先在 SSMS 中运行查询并不会使 bcp 受益……如果有的话,情况正好相反。

我对 pnd_date 值的多个范围执行此操作,并且每次都是相同的。我先运行 bcp 命令,然后在 SSMS 中运行相同的选择查询,每次 SSMS 查询至少花费两倍的时间才能完成。

SSMS 仅检索结果,而 bcp 具有将结果写入磁盘上的新文件的额外开销。这对我来说绝对是零意义......但我希望我能学到一些东西,让我的 SSMS 查询和 bcp 一样快。谁能解释一下?

【问题讨论】:

  • 您是否重新计算了统计数据并检查了来自 SSMS 的查询计划?
  • @PieterGeerkens 索引在运行之前已重建...我的理解是这也会更新统计信息。查询计划显示聚集索引扫描...... pnd_date 上有一个索引,但据我了解,在这么多记录上使用非聚集索引上的书签查找效率不高。只是为了好玩,我尝试将 pnd_date 设为聚集索引以查看它的执行方式,并且它的执行方式更像 bcp 命令。当然,它不是生产中的聚集索引,所以这没有帮助。

标签: sql-server-2008 ssms bcp


【解决方案1】:

bcp 是针对导入导出优化的实用程序,而 SSMS 是通用实用程序。预计 bcp 更快。如果它不比 SSMS 快,为什么要使用它,或者 Microsoft 提供此实用程序的原因。

关于为什么 bcp 更快,我大致可以总结以下几点。

  • SSMS 使用 .NET,因此与 bcp 相比它有一些开销
  • SSMS 具有 GUI,因此 GUI 线程会消耗资源
  • 在 SSMS 使用的 .NET 中,写入文件几乎总是比数据绑定网格快。其实写文件是非常快的操作。
  • SSMS 很可能使用 .NET DataSet/DataTable 构造,它是一个包含所有开销的 xml。
  • 为单一用途(bcp 导入/导出)提供的实用程序通常比通用工具 SSMS 更快。

【讨论】:

  • 1) bcp 使用什么比.NET 快得多? 2) 尝试打开十几个应用程序,看看额外的 GUI 线程对您的查询性能有多大影响。只要您的内存不低,我怀疑它会。 3) 我之前在我的应用程序中对数据绑定速度进行了基准测试。这并不重要……与我们在这里谈论的 17 秒差异相比,绝对没有什么。 4) 很确定它使用 SqlDataReader。
  • 5) 单一用途的实用程序并不仅仅因为它是单一用途的事实而变得更快。我很想知道为什么它更快,以及我是否可以学习如何根据这些知识改进我的代码。
  • +1 的想法。我的经验让我认为这些不是原因(除了你的第一点......可能是 bcp 以普通人群无法使用的方式访问数据库),但我非常感谢您的努力。
  • 仅供参考,我的查询返回大约一百万条记录。执行“从 pinvdet 中选择前 500000 *”在 7 秒内完成。
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多