문제

나는 현재 더 큰 Wikipedia-dump 파생 된 PostgreSQL 데이터베이스와 함께 일하고 있습니다. 약 40GB의 데이터가 포함되어 있습니다. 데이터베이스는 SUSE Linux Enterprise Server 10을 사용하여 HP Proliant ML370 G5 서버에서 실행 중입니다. 간단한 D- 링크 라우터가 관리하는 개인 네트워크를 통해 노트북에서 쿼리하고 있습니다. 정적 DHCP (개인) IP를 랩톱과 서버 모두에 할당했습니다.

어쨌든, 내 노트북에서 Pgadmin III을 사용하여 SQL 명령/쿼리를 보냅니다. 이들 중 일부는 인덱스 생성, 삭제 인덱스, 삭제, 선택 등입니다. 명령은 서버에서 자고있는 것 같습니다. PostgreSQL이 쿼리를 처리 할 준비가 된 우체국 장 풀을 유지한다고 스스로에게 말합니다. 그러나이 과정이 6GB를 9.4GB 할당 된 RAM을 먹으면 걱정합니다 (그리고 지금은 그렇게합니다). 이제 이것은 다른 쿼리가 동일한 데이터를 사용해야하는 경우 [공유] 메모리에 보관 된 데이터 캐시 일 것입니다.

또 다른 것은 나를 괴롭히는 것입니다.

나는 2 개의 테이블이있다. 하나는입니다 페이지 테이블; 나는 그것에 대한 색인이 있습니다 page_id 열. 다른 하나는 pagelinks 테이블이 있습니다 pl_from 아무것도 또는 변수를 참조하는 열 page.page_id 열; 와는 달리 page_id 열, pl_from 색인이 없습니다 (아직). 테이블의 규모와 실행 가능한 솔루션을 찾을 필요성에 대한 아이디어를 제공하기 위해 페이지 테이블에는 1,340 만 행이 있습니다 (필요하지 않은 것들을 삭제 한 후) pagelinks 표에는 2 억 9,300 만 명이 있습니다.

청소하려면 다음 명령을 실행해야합니다. pagelinks 쓸모없는 행의 일부 테이블 :

DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);

그래서 기본적으로, 나는 그것을 제거하고 싶습니다 pagelinks 페이지에서 나오는 모든 링크 테이블 페이지 테이블. 중첩 루프 및/또는 순차적 스캔을 비활성화 한 후에도 쿼리 옵티마이저는 항상 다음 "솔루션"을 제공합니다.

Nested Loop  (cost=494640.60..112115531252189.59 rows=3953377028232000 width=6)
  Join Filter: ("outer".pl_from <> "inner".page_id)"
  ->  Seq Scan on pagelinks  (cost=0.00..5889791.00 rows=293392800 width=17)
  ->  Materialize  (cost=494640.60..708341.51 rows=13474691 width=11)
        ->  Seq Scan on page  (cost=0.00..402211.91 rows=13474691 width=11)

그러한 과제는 완료하는 데 몇 주가 걸리는 것 같습니다. 분명히, 이것은 용납 할 수 없습니다. 나에게 나는 오히려 그것을 많이 사용하는 것 같습니다. page_id 그 일을하기 위해 색인 ... 그러나 그것은 완고한 옵티마이저이기 때문에 틀릴 수도 있습니다.

도움이 되었습니까?

해결책 2

실제로, 나는 쿼리 실행 속도를 높이기 위해 임시 테이블을 만들기로 결정했습니다.

CREATE TABLE temp_to_delete AS(
    (SELECT DISTINCT pl_from FROM pagelinks) 
        EXCEPT 
    (SELECT page_id FROM page));
DELETE FROM pagelinks USING temp_to_delete 
    WHERE pagelinks.pl_from IN (temp_to_delete.pl_from);

놀랍게도,이 쿼리는 약 4 시간 안에 완료된 반면, 초기 쿼리는 내가 그것을 죽이기로 결정하기 전에 약 14 시간 동안 활성화되었습니다. 보다 구체적으로, 삭제가 반환되었습니다.

Query returned successfully: 31340904 rows affected, 4415166 ms execution time.

내 질문의 첫 번째 부분에 관해서는, 우체국 마스터 프로세스가 실제로 캐시에 정보를 유지하는 것으로 보입니다. 다른 쿼리에 캐시에 정보가 필요하지 않고 일부 메모리 (RAM)가 필요하면 캐시가 비워집니다. 그리고 우체국 장은 실제로는 프로세스 풀입니다. '

그것은 또한 나에게 일어났다 Gnome-System Monitor 불완전한 정보를 제공하는 신화이며 정보 가치는 가치가 없습니다. 그것은 주로이 응용 프로그램 때문입니다. 최근에 내가 너무 혼란 스러웠습니다. 예를 들어, Postgres 사용자와 같은 다른 사용자의 메모리 사용량을 고려하지 않으며 심지어 너무 사실이 아닌 경우 12GB의 RAM이 남아 있다고 말합니다. 따라서 PostgreSQL이 자원을 어떻게 사용하고 있는지 알고 싶어서 몇 가지 시스템 모니터를 사용해 보았습니다. xosview 실제로 유효한 도구입니다.

도움이 되었기를 바랍니다!

다른 팁

두 번째 질문에; 진술서로 작성 테이블을 사용하여 필요한 레코드만으로 새 테이블을 만들 수 있습니다. 새 테이블이 충분히 작 으면 더 빠를 수도 있지만 도움이되지 않을 수 있습니다.

고객과의 연결이 열려있는 한 우체국 장 마스터 프로세스는 그곳에 머물게됩니다. pgadmin은 연결을 닫습니까? 모르겠어요.

사용 된 메모리는 Shared_Buffers (구성 설정 확인) 일 수 있습니다.

이제 쿼리입니다. 이와 같은 대규모 유지 보수 작업의 경우 Work_mem을 GB와 같은 큰 것으로 자유롭게 설정하십시오. 당신은 당신이 많은 램을 가지고있는 것처럼 보이므로 사용하십시오.

work_mem을 '4GB'로 설정하십시오. pl_from이없는 pagelinks에서 삭제를 설명하십시오 (페이지에서 page_id);

SEQ 스캔 페이지, 해시 및 SEQ 스캔 PageLinks가 해시에서 엿보기로 Page_IDS를 확인해야합니다. 매우 빠르야합니다 (4 시간보다 훨씬 빠릅니다!) 그러나 해시에는 큰 Work_mem이 필요합니다.

그러나 테이블의 상당 부분을 삭제하기 때문에 다음과 같이 더 빠를 수 있습니다.

테이블 pagelinks2를 선택하여 a.*에서 a.pl_from = b.page_id에서 pagelinks에서 조인 페이지 b를 만듭니다.

(대신 간단한 조인을 사용할 수 있습니다)

이 쿼리에서 주문을 추가 할 수도 있으며, 새 테이블은 나중에 최적의 액세스를 위해 디스크에서 멋지게 주문됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top