2014-09-19 2 views
0

내 쿼리는 매우 큰 데이터베이스에서 선택 별개이고 pgAdmin sql 도구에서 쿼리 자체는 12 초간 지속됩니다.SELECT DISTINCT SQL에서 페이지 매김을 최적화하는 방법?

SELECT DISTINCT ON (city, airport, zip, country, name) city, airport, price, id FROM mytable; 

스프링이 배치 독자 정의 : I가 PAGE_SIZE 데이터베이스 열만큼 큰 것으로 정의하면

JpaPagingItemReader<MyEntity> reader; 
reader.setPageSize(PAGE_SIZE); 

성능은 12 초와 동일하다. 그러나 크기를 더 낮게 설정하면 (예 : 1.000.000 datarows db에서 pagesize = 100.000) 성능이 매우 나쁨 (~ 10 배).

스프링 배치는 백그라운드의 쿼리에 특정 페이지 매김을 적용합니다. 어떤 것은 수행합니다

firstResult, maxResult 
    0, 10 
    10, 10 
    20, 10 
    30, 10... 

이 다시 SQL에 LIMITOFFSET로 변환 :

query.setFirstResult(); 
query.setMaxResult(); 

페이지 크기가 10 인 경우는, 다음과 같이 실행 쿼리가 덴.

질문 : SELECT DISTINCT ON은 페이지 매김 LIMIT/OFFSET과 결합 할 수 없습니까? 내게는 마치 전체 선택 고유 쿼리가 각각의 "페이지 매김"실행에서 다시 실행되는 것처럼 보이며 따라서 매우 오래 지속됩니다.

따라서 maxresults를 적용하기 전에 데이터베이스가 반드시 전체 별개 선택을 수행해야하는 경우 "별개"선택을 임시 저장하고 다음 페이지를 가져올 수 있습니까?

페이징 크기를 1 백만으로 설정하지 않아도 어떻게 향상시킬 수 있습니까? 아니면 여기서 개선 할 수 없습니까?

+0

문제가 발생할 수있는 인덱스가없는 열이있는 경우 쿼리 분석기를 사용하여 진행 상황을 확인하십시오. –

+0

'city, airport, zip, country, name'에 대한 색인이 있습니다. – membersound

+1

언급 한 바와 같이 pgadmin 도구를 사용하여 쿼리 (페이지 및 페이지 없음)의 실행을 분석하고 어떤 일이 일어나고 있는지, 너무 많은 시간이 걸리는지 확인하십시오. 또한 이것은 postgresql 가이드에 언급되어 있습니다 * "OFFSET 절로 건너 뛴 행은 여전히 ​​서버 내부에서 계산되어야하기 때문에 큰 오프셋은 비효율적 일 수 있습니다."* –

답변

1

처리를 위해 다중 스레드를 사용하지 않는 경우, 대체 방법은 JdbcCusorItemReader을 사용하는 것입니다. 그렇게하면 쿼리의 페이징 측면을 전혀 최적화 할 필요가 없습니다. 여러 스레드를 사용하는 경우이 옵션이 아닙니다.

+0

OK, 여러 스레드를 사용하고 있지 않습니다. – membersound