【问题标题】:query execution time查询执行时间
【发布时间】:2011-07-19 10:56:00
【问题描述】:

我想知道是否有人可以帮助我理解以下查询执行行为:

我有两个相似的表,table2 包含 5000000 条记录。

查询:INSERT INTO table1 SELECT * FROM table2。 执行时间:A ms。

查询:INSERT INTO table1 SELECT * FROM table2。 执行时间:B ms。

有时 B >> A(B 比 A 大得多)。两个查询是相同的并且运行两次。同一查询需要很长时间的原因可能是什么?

非常感谢!

【问题讨论】:

  • 我认为内存问题。在第一个表之后,它只是用完内存来缓冲执行。你有没有尝试切换A然后B到B然后A?
  • 您是否在每个语句后发出显式的 BEGIN COMMIT 命令?您至少需要提供解释计划。
  • 没有限制。一列是主键,并且有索引。我无法比较 INSERT 和 SELECT 案例。我认为这不是内存问题,因为我重新启动了机器(以清除缓存数据)并运行查询。但是,它花费的时间更少。我为我的工作运行了大约 20 次相同的查询,我观察到这种行为(长执行时间)大约 6-7 次。我正在尝试与 EXPLAIN ANALYZE 一起重新生成此案例。
  • 另外,我没有使用 BEGIN COMMIT 命令。但是,我在 PostgreSQL 文档中读到,默认情况下每个命令都是自动提交的。

标签: postgresql


【解决方案1】:

你能做测试,并过去所有的信息,包括执行时间,表 ddl out 吗? 更重要的是,您可以在您的陈述之前使用“解释分析”来查看两者之间是否有任何区别 两种情况。

【讨论】:

  • 这里是表定义 - CREATE TABLE staff ( staff_id integer PRIMARY KEY, first_name character varying(45) NOT NULL, last_name character varying(45) NOT NULL, address_id integer NOT NULL, email character varying( 50), store_id integer NOT NULL, active boolean DEFAULT true NOT NULL, username character varying(16) NOT NULL, password character varying(40), last_update timestamp without time zone DEFAULT now() NOT NULL, picture bytea);
  • 正如我在上述评论中发布的那样,我正在尝试重新生成案例,我会在收到后立即发布。上次我观察到如果 A 是 15 分钟,那么 B 大约是 2 小时(A = 更少的执行时间,B = 长的执行时间)。
猜你喜欢
  • 2016-01-13
  • 2016-11-10
  • 2011-04-03
  • 2013-02-23
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多