2010-05-24 3 views
4

으로, 느린 때때로 :이유는 PostgreSQL의 업데이트 쿼리는 (BOOLEAN은 false (기본값) foo는 열 유형입니다) 내가 간단한 업데이트 쿼리가 있더라도 인덱스

update tablename set foo = true where id = 234; 

"ID가"로 설정되어있는 (주)

Index Cond: (id = 234) 
Total runtime: 0.358 ms 

을하지만 여전히, 내가 200S보다 더 많은했다 느린 로그 (pgfouine)에서 설명 할 수없는 쿼리의 많음이있다 : 키와 내가 실행하면 내가 가진 "설명 분석"(?!) :

Times executed: 99, Av. duration (s): 70 

누구나 설명해주십시오, 그 이유는 무엇입니까? (테이블에 1.5 mio 행, postgresql 8.4)

+0

'id'가 PK 인 경우 (업데이트 된 행이 최대 1 개이기 때문에) 이는 사실상 순간적이어야합니다. 어느 쪽이든 (진공 분석을 상세하게 실행) 문제가 있거나 다른 쿼리가 전체 테이블을 잠그고 있습니다 ... postgresql 로그에서 200s 쿼리를 ideintify 할 수 있습니까? 구성에 "log_duration"매개 변수를 설정 했습니까? – leonbloy

+0

예, "log_min_duration_statement"를 1000으로 설정 했으므로 slowlog 파일에서 이러한 쿼리를 얻었습니다. 해당 로그 파일에서 200 개의 쿼리를 식별하고 이러한 간단한 업데이트 만 수행합니다. 이 경우 postgresql 전체 테이블 잠금, 행 수준 잠금에 의해 관리되지 않습니까? "누가"이것을 잠그는 지 확인할 수있는 방법이 있습니까? 이 느린 쿼리가 새로 생성 된 행의 원인 일 수 있습니까? 그냥 추측, 난 아무 생각이 전혀 – matija

+0

postgresql에서 업데이 트가 전혀 독자를 잠그지 않으므로 잠금 전혀 문제가되지 않을 수도 있습니다. shared_buffers와 같은 매개 변수를 조정 했습니까? 특정 시간에 예기치 않게 천천히 실행되는 쿼리가 발생합니까? 그들은 함께 여러 가지 일을하는지 아니면 가끔씩 혼자서 일어나는 일입니까? – araqnid

답변

2

내 생각에 처음으로 전체 테이블이나 업데이트되는 행을 잠그는 다른 쿼리가있을 것입니다. 간단한 업데이트는 다른 작업이 완료 될 때까지 기다려야합니다.

1

업데이트 된 열에 대한 색인이나 제약 조건이 없는지 확인하십시오. 그렇다면 데이터베이스가 인덱스 재 계산 또는 제한 조건 평가를 수행 중일 수 있습니다. 이러한 추가 작업은 EXPLAIN ANALYZE 결과에 포함되지 않습니다.

I/O 작업으로 인해 속도가 느려질 수 있습니다. 이 thread about UPDATE performance in Postgres을 확인하십시오.

+1

Re : 느린 업데이트, 이것도 유용 할 수 있습니다 : http://stackoverflow.com/questions/3361291/slow-simple-update-query-on-postgresql- 3 백만 행 데이터베이스 # comment3495735_3361903 –