2014-04-22 4 views
3

저는 테이블에 많은 행을 삽입하는 정말 큰 쿼리를 실행하고 있습니다. 거의 8 일부 작은 쿼리에서는 행 수가 백만분의 1로 나뉘지만 잠시 후에 "오류가 발생합니다"임시 파일에 블록을 쓸 수 없습니다. 장치에 남아있는 공간이 없습니다 ... "postgresql 사용". 각 쿼리가 끝난 후 임시 파일을 삭제해야하는지, 어떻게 할 수 있는지 또는 다른 문제와 관련이 있는지 여부는 알 수 없습니다.postgresql을 사용하여 ".... 블록을 쓸 수 없습니다."postgresql을 사용하여

고맙습니다.

+0

검색어는 어떻게 보이나요? 검색어를 실행하기 전에 기기에 남은 공간은 얼마입니까? – frlan

+0

일부 값()이있는 삽입 쿼리입니다 ... 각 쿼리에는 거의 100.000 값 절이 있습니다 ..., – jacr1614

+0

.. 삽입을 수행하는 테이블은 어떻게 정의되어 있습니까? – frlan

답변

4

확인. 여전히 몇 가지 사실이 누락되어 있으므로 답변을 시도하면 문제가 명확해질 수 있습니다.

디스크 공간이 부족한 것으로 보입니다. 디스크에 충분한 공간이 없기 때문일 가능성이 큽니다. 예를 들어 Linux/Unix df -h을 확인하십시오.

다음과 같은 상황이 발생했을 때를 알 수 있습니다. 어쩌면 3 개의 정수가있는 테이블을 사용하면 데이터만으로 약 12Byte를 차지하게됩니다. 행 관리 등을 위해 오버 헤드를 추가해야합니다. another answer Erwin은 약 23Byte를 언급하고 자세한 내용은 설명서에 링크되어 있습니다. 또한 행 사이에 약간의 패딩이 필요할 수도 있습니다. 따라서 약간의 계산을 수행하십시오.

3 개의 정수가 있더라도 행당 약 40 바이트가됩니다. 8,000,000을 삽입하기를 원한다는 점을 감안하면 320,000,000Byte 또는 ~ 300MB까지 합계합니다 (우리의 3 가지 정수 예제에 대해서만, 매우 대략적으로).

이제이 테이블에 두 개의 인덱스가 있습니다. 인덱스는 삽입 중에도 커집니다. 또한 또 다른 측면은 테이블과 인덱스에서 부 풀릴 수 있으며 진공으로 제거 할 수 있습니다.

그래서 해결책 작업은 다음과 같습니다

  1. 이 삽입 좀 더 분할 및 확인 데이터베이스에 더 많은 디스크 공간을 제공, 진공 그들 사이에 실행
+0

오류를 표시합니다. 삽입 만 실행하면 그 사이의 진공을 실행하면 아무 것도 변경되지 않습니다.'vacuum'은 삭제되거나 갱신 된 쓸데없는 행만을 지 웁니다. 'insert'는 결코 진공 청소기를 사용할 수있는 행을 생성하지 않습니다. –

+0

이제 우리는 쿼리 세트가 실제로 어떻게 보이는지 실마리가되어 상처를 입지 않을 것이라고 생각합니다. – frlan

+0

필자는 System ('df -h >> disk_usage.log')을 사용하여 그 .. 및. 이 경우에는 진공이 작동하는지 모르겠습니다 ... – jacr1614

1

오류는 매우 자체입니다 - 설명. 큰 쿼리를 실행하고 있지만 아직 수행 할 디스크 공간이 충분하지 않습니다. 쿼리를 실행할 충분한 공간이 있으면 postgresql이 /opt...check에 설치되어 있는지 확인하십시오. 출력을 제한하지 않고 예상 출력을 얻은 것을 확인한 다음 쿼리를 실행하고 출력을 파일에 씁니다.

관련 문제