developer tip

PostgreSQL 임시 테이블

copycodes 2020. 11. 11. 20:17
반응형

PostgreSQL 임시 테이블


250 만 번 쿼리를 수행해야합니다. 이 쿼리는 필요한 행을 생성 AVG(column)한 다음이 AVG사용 하여 평균 미만의 모든 값에서 테이블을 필터링합니다. 그런 다음 INSERT이러한 필터링 된 결과를 테이블로 가져와야합니다.

합리적인 효율성으로 그러한 일을 수행하는 유일한 방법 TEMPORARY TABLE은 각 query-postmaster python-thread에 대해 생성하는 것 같습니다 . 나는이들이 TEMPORARY TABLE하드 드라이브 (전혀)에 지속되지 않고 물론 작동 메모리가 부족하지 않는 한 메모리 (RAM)에 남아 있기를 바랍니다.

TEMPORARY TABLE에 디스크 쓰기가 발생하는지 알고 싶습니다 (이는 INSERTS를 방해합니다. 즉, 전체 프로세스가 느려짐).


Postgres에서 임시 테이블의 기본 동작은 자동으로 삭제되지 않고 커밋시 데이터가 유지된다는 것입니다. 을 참조하십시오 ON COMMIT.

그러나 임시 테이블은 데이터베이스 세션이 끝날 때 삭제됩니다 .

임시 테이블은 세션이 끝날 때 또는 선택적으로 현재 트랜잭션이 끝날 때 자동으로 삭제됩니다.

고려해야 할 여러 가지 사항이 있습니다.

  • DROP트랜잭션이 끝날 때 명시 적 으로 임시 테이블을 만들려면 CREATE TEMPORARY TABLE ... ON COMMIT DROP구문을 사용하여 만듭니다 .
  • 연결 풀링 이있는 경우 데이터베이스 세션은 여러 클라이언트 세션에 걸쳐있을 수 있습니다. 피하기 충돌에 CREATE, 당신은 당신의 임시 테이블을 드롭한다 - 중 사전 (예 : 트랜잭션 내의 모든 일을하고 사용하여 풀에 연결을 반환에 ON COMMIT DROP생성 구문을), 또는 (AN 필요에 따라-기준으로 항에 의해 CREATE TEMPORARY TABLE문을 해당 DROP TABLE IF EXISTS, 예를 들어 연결이 자동 커밋 모드에서 사용되는 경우 외부 트랜잭션에서도 작동하는 이점이 있습니다.)
  • 임시 테이블을 사용하는 동안 디스크로 넘치기 전에 메모리에 얼마나 들어갈 수 있습니까? temp_buffers옵션을 참조하십시오postgresql.conf
  • 임시 테이블로 자주 작업 할 때 걱정해야 할 다른 사항이 있습니까? 임시 테이블을 DROP 한 후 카탈로그에서 데드 튜플을 정리하기 위해 vacuum을 사용하는 것이 좋습니다. Postgres는 기본 설정 ( auto_vacuum)을 사용할 때 자동으로 3 분마다 진공 청소기로 청소합니다 .

또한 질문과 관련이 없습니다 (하지만 프로젝트와 관련이있을 수 있음). 임시 테이블 채운 임시 테이블에 대해 쿼리를 실행해야하는 경우 적절한 인덱스를 만들고 ANALYZEon 을 실행하는 것이 좋습니다 . 삽입을 마친 문제의 임시 테이블 . 기본적으로 비용 기반 옵티마이 저는 새로 생성 된 임시 테이블에 ~ 1000 개의 행이 있다고 가정하고 임시 테이블에 실제로 수백만 개의 행이 포함되어 있으면 성능이 저하 될 수 있습니다.


임시 테이블은 단 하나의 보증 만 제공합니다. 세션이 끝날 때 삭제됩니다. 작은 테이블의 경우 백업 저장소에 대부분의 데이터가있을 것입니다. 큰 테이블의 경우 데이터베이스 엔진이 다른 요청을 위해 더 많은 작업 공간을 필요로하기 때문에 데이터가 주기적으로 디스크로 플러시된다는 것을 보장합니다.

편집 : RAM 전용 임시 테이블이 절대적으로 필요한 경우 RAM 디스크 (/ dev / shm 작동)에 데이터베이스를위한 테이블 공간을 만들 수 있습니다. 이렇게하면 디스크 IO의 양이 줄어들지 만 현재 물리적 디스크 쓰기 없이는이 작업을 수행 할 수 없습니다. DB 엔진은 임시 테이블을 생성 할 때 테이블 목록을 안정적인 스토리지로 플러시합니다.

참고 URL : https://stackoverflow.com/questions/486154/postgresql-temporary-tables

반응형