2009-11-03 7 views
0

PostGres 8.3 데이터베이스 (Solaris에서 실행 중, 업데이트는 SOAP를 통해 Perl 5.8 스크립트에 의해 구동 됨)의 일부 데이터를 업데이트하는 저속 실행 프로세스의 성능을 향상 시키도록 지정되었습니다. 시간 소비량의 약 50 %는 제어 할 수 없으므로 50 %를 조정하는 것이 중요합니다.성능 최적화 - Postgres

약 7,000,000으로 팽창하는 것을 보았지만 테이블에는 일반적으로 약 4,500,000 개의 행이 있습니다. 업데이트가 쿼리하는 ID (기본 또는 고유하지 않음)는 9000 개 미만의 별개 값을 가지며 발생 확산은 ID 당 1만큼 크게 가중됩니다 (중간 값은 20, 최대 값은 7000).

이 ID에는 색인이 있지만 이러한 데이터가 부족하여 더 좋은 방법이 있는지 궁금합니다. 나는 또한 비정규 화하는 것들을 고려하고있다. (데이터베이스는 수퍼 정규화되지 않는다.) & 데이터를 별도의 테이블 (아마도 트리거에 의해 제어되거나 유지 관리되는)에 끌어 와서 처리 속도를 높이는 데 도움이된다.

지금까지 나는 (세션 변수를 불필요하게 설정하지 않고 살아 있는지 확인하기 위해 n 초마다 데이터베이스에 ping을하지 않는) 아주 기본적인 조정을했다. 이것이 도움이되었지만 나는 실종되었다고 느낀다. 데이터와 함께 ...

누군가가 관련 데이터를 별도의 테이블로 끌어내는 것이 정말 도움이 될 훌륭한/끔찍한 아이디어라고해도! 다른 아이디어 (또는 설명을위한 추가 질문)가 감사하게 접수되었습니다!

검색어 :

UPDATE tab1 SET client = 'abcd', invoice = 999 
    WHERE id = 'A1000062' and releasetime < '02-11-09'::DATE 
    AND charge IS NOT NULL AND invoice IS NULL AND client IS NULL; 

내가이 'null가 아닌'이상적인 거리가 멀다 알고 있습니다. ID는 인보이스 & 클라이언트 (btrees)와 같이 색인되어 있으므로 PostGres에서/색인/색인을 사용할 수 있음을 이해합니다.

Bitmap Heap Scan on tab1 (cost=17.42..1760.21 rows=133 width=670) (actual time=0.603..0.603 rows=0 loops=1) 
    Recheck Cond: (((id)::text = 'A1000062'::text) AND (invoice IS NULL)) 
    Filter: ((charge IS NOT NULL) AND (client IS NULL) AND (releasetime < '2009-11-02'::date)) 
    -> Bitmap Index Scan on cdr_snapshot_2007_09_12_snbs_invoice (cost=0.00..17.39 rows=450 width=0) (actual time=0.089..0.089 rows=63 loops=1) 
    Index Cond: (((snbs)::text = 'A1000062'::text) AND (invoice IS NULL)) 
Total runtime: 0.674 ms 

자동 진공 내가 생각이다 활성화 : 그것은

쿼리 계획 (분석과 설명) ... 아주 사소한 질문입니다. 외래 키 제약 조건은 없지만 팁을 주신 것에 대해 감사드립니다.

저는 통계 값을 높이는 아이디어를 정말 좋아합니다. 바로 그걸로 놀 수 있습니다.

+1

쿼리 계획이 어떻게 보이는지, 자동 진공을 사용할 수 있습니까? 아니면 자동 진공을 실행하지 않고 정기적으로 진공을 수행합니까? –

답변

0

일부 쿼리 계획을 가져와 질문을 편집해야합니다. 일을 더 잘 수행하는 방법을 찾는 데 도움을 줄뿐만 아니라 개선을 쉽게 측정하는데도 사용할 수 있습니다.


SQL을 변경하거나 쿼리 계획을 결정하는 데 사용되는 인덱스와 통계를 조정하여 성능에 영향을 줄 수 있습니다.


지원 인덱스가없는 외래 키 제약 조건이있을 수 있습니다. PostgreSQL은 외래 키 제약 조건을 만들 때 자동으로 추가하지 않습니다. 참조 된 테이블에 행 삭제 (또는 참조 필드 업데이트)가 있으면 참조 테이블을 완전히 스캔하여 삭제를 계단식으로 만들거나 삭제 된 테이블을 참조하는 행이 없는지 확인해야합니다.


id 필드의 분포가 매우 비뚤어진 경우 해당 열의 통계를 늘리면 도움이 될 수 있습니다.

통계가 100으로 설정된 경우 샘플에서 가장 일반적인 100 개의 ID가 빈도와 함께 기록됩니다. PostgreSQL이 다른 8900 ID 들인 또는 약 250-400 번 사이에 균등하게 떨어질 것이라고 2에서 350 만 개의 행을 남기고 테이블의 약 50 %를 차지한다고 가정 해보십시오.

상위 1000 개 ID가 행의 95 %를 차지하는 경우 PostgreSQL은 가장 일반적인 1000 개 목록에없는 ID가 각각 약 30-40 회 발생한다고 가정합니다.

견적이 변경되면 선택한 쿼리 계획이 영향을받을 수 있습니다. 쿼리 패턴이 빈번하게 발견 된 ID가 적은 ID를 더 자주 선택하면, PostgreSQL은 ID가 몇 번이나 발견 될지 예측할 것입니다.

가장 자주 발생하는 값을 많이 저장하면 성능 비용이 발생하기 때문에 실제 쿼리 이득을 얻는 지 여부를 결정하기 위해 쿼리 계획 분석을 지원해야합니다.