jae*_*ard 5 postgresql truncate
在 Postgres 9.3.6 中,对包含 <10 行的表进行截断通常需要 2-3 分钟。
在延迟期间,截断在事务中陷入 waiting=f 且 state=idle 状态。
在网上研究这个问题,这个问题的标准答案是锁争用,但这里的情况似乎并非如此。这种情况发生在除 CI 测试之外已卸载的 CI 主机上。根据 pg_stat_activity,truncate 是唯一正在运行的语句,并且根据 pg_locks,没有未授予的锁,因此在我看来,truncate 并没有被阻塞等待锁。
此外,我检查了 postgres 日志中是否有死锁错误,但没有发现任何错误。
(请注意,我们使用截断而不是 10 行,因为这个问题是在 CI 测试期间发生的 - 在正常生产操作期间,此表中有 10^6 行,因此截断是有意义的。这是一个工作中间表,之前被截断每次运行 ETL 流程。)
我不知道从这里去哪里——任何建议将不胜感激!以下是相关查询的输出:
warehouse=# select pid,usename,backend_start,xact_start,query_start,now()-query_start as wait_time,state_change,waiting,state,query from pg_stat_activity;
-[ RECORD 1 ]-+-----------------------------------------------------------------------------------------------------------------------------------------------
pid | 25123
usename | dev
backend_start | 2015-04-13 23:25:47.728267+00
xact_start | 2015-04-14 00:23:39.969074+00
query_start | 2015-04-14 00:23:39.969074+00
wait_time | 00:00:00
state_change | 2015-04-14 00:23:39.969081+00
waiting | f
state | active
query | select pid,usename,backend_start,xact_start,query_start,now()-query_start as wait_time,state_change,waiting,state,query from pg_stat_activity;
-[ RECORD 2 ]-+-----------------------------------------------------------------------------------------------------------------------------------------------
pid | 5288
usename | fk-etl
backend_start | 2015-04-14 00:21:20.913133+00
xact_start | 2015-04-14 00:21:20.921312+00
query_start | 2015-04-14 00:21:20.92142+00
wait_time | 00:02:19.047654
state_change | 2015-04-14 00:21:20.928318+00
waiting | f
state | idle in transaction
query | TRUNCATE TABLE foo_schema.foo
warehouse=# select * from pg_locks;
warehouse=# SELECT relation::regclass as object, mode,granted,pid FROM pg_locks;
-[ RECORD 1 ]---------------------------------------------------------------------------
object |
mode | ExclusiveLock
granted | t
pid | 5288
-[ RECORD 2 ]---------------------------------------------------------------------------
object | pg_locks
mode | AccessShareLock
granted | t
pid | 25123
-[ RECORD 3 ]---------------------------------------------------------------------------
object |
mode | ExclusiveLock
granted | t
pid | 25123
-[ RECORD 4 ]---------------------------------------------------------------------------
object | foo_schema.foo_compound_idx
mode | AccessExclusiveLock
granted | t
pid | 5288
-[ RECORD 5 ]---------------------------------------------------------------------------
object | foo_schema.foo
mode | ShareLock
granted | t
pid | 5288
-[ RECORD 6 ]---------------------------------------------------------------------------
object | foo_schema.foo
mode | AccessExclusiveLock
granted | t
pid | 5288
-[ RECORD 7 ]---------------------------------------------------------------------------
object | foo_schema.foo_pkey
mode | AccessExclusiveLock
granted | t
pid | 5288
-[ RECORD 8 ]---------------------------------------------------------------------------
object | pg_toast.pg_toast_10043463
mode | ShareLock
granted | t
pid | 5288
-[ RECORD 9 ]---------------------------------------------------------------------------
object | pg_toast.pg_toast_10043463
mode | AccessExclusiveLock
granted | t
pid | 5288
-[ RECORD 10 ]--------------------------------------------------------------------------
object | pg_toast.pg_toast_10043463_index
mode | AccessExclusiveLock
granted | t
pid | 5288
-[ RECORD 11 ]--------------------------------------------------------------------------
object |
mode | ExclusiveLock
granted | t
pid | 5288
Run Code Online (Sandbox Code Playgroud)
state | idle in transaction
query | TRUNCATE TABLE foo_schema.foo
Run Code Online (Sandbox Code Playgroud)
已TRUNCATE完成,会话正在等待下一条语句或COMMIT.
听起来这是一个应用程序端问题,但在没有有关运行什么的信息的情况下不可能肯定地说TRUNCATE。
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |