【问题标题】:SELECT vs CREATE TABLE AS SELECT execution timeSELECT vs CREATE TABLE AS SELECT 执行时间
【发布时间】:2017-05-17 07:56:24
【问题描述】:

我的函数应该返回一个TABLE,它是由许多连接创建的,并且相对“大”。

如果在我的函数内部我输入了return query select <complex query goes here>;,那么运行需要很长时间(更像是 10-15 分钟)。

但是,如果我不返回TABLE,而是返回VOID 并简单地在函数体内创建一个表 - 它在 1 分钟内完成。

select <complex query goes here> VS create table <table name> as select <complex query goes here> 然后select * from <table_name> 运行这个“复杂查询”也是如此。

为什么执行时间会有这样的差异?

附:查询的 select 子句大约有 35 列,其中包含一些逻辑。

附言该查询仅返回大约 90K 行,因此我怀疑这是通过网络发送数据所花费的时间

【问题讨论】:

  • 检索数据的时间?.. 比较计划 - 两者应该相同,如果是这样,则需要将数据发送到客户端(并显示它)
  • 要验证这一点,请尝试从快速版本中创建的表中SELECT *
  • SELECT * from that table 大约需要 10 秒才能返回数据
  • @Dennis 所有数据?.. 还是只是一页?.. Laurenz 的方式很好,但可以被客户克服 - 尝试在 psql 中运行 \copy table_name to 'local_file'?..
  • @VaoTsun 好的。不知道为什么会这样,但是为“所有数据”选择 * 也需要很长时间(我在几分钟后停止了它)。 “复制”命令在 3 秒内完成相同的操作。知道为什么会这样吗?输出文本文件大小为 36MB。

标签: postgresql


【解决方案1】:

回答

selectcreate table as select 使用数据的方式不同,首先将数据发送到客户端,然后将数据保存到磁盘服务器端。

为什么

可能的原因可能是链接速度慢,以及客户端的“功能”。根据本地 psql 运行 \copy (select * from) to 'local_file' 需要 3 秒而 PgAdmin 需要很长时间才能显示 sam 数据的事实,我假设您的 PgAdmin 版本(或任何版本)并不意味着您要显示的数据量(如你说36MB)。所以不是链接,而是客户端。

【讨论】:

  • PSequel 显示所有数据需要 40 秒
  • SQLWorkbenchJ 需要 1 分钟
猜你喜欢
  • 2013-06-29
  • 2010-11-27
  • 1970-01-01
  • 2020-11-27
  • 2020-02-08
  • 2018-12-28
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多