2016-06-03 2 views
0

저는 Postgres를 처음 접했지만 관계형 데이터베이스는 아니며 오늘 밤 이상한 결과가 나오는 쿼리를 작성했습니다. 누군가가 카운트와 관련된 일을 설명하도록 도울 수 있습니까? (결과는 좋다 - 400000 개 레코드를 반환) 두 화합물 기본 키 컬럼에Postgres의 이상한 그룹 문제

select * from mytable; 

두 번째 쿼리 그룹 :

첫 번째 쿼리는 400,000 결과 (행)을 제공

select PK1, PK2, count(*) cnt 
    from mytable 
group by PK1, PK2 

을 세 번째 쿼리는 140 만 건이 넘는 레코드를 잘못 제공합니다.

select PK1, PK2 
    from mytable 
group by PK1, PK2 

유일한 차이점은 b입니다. 두 번째와 세 번째 쿼리 사이에 개수 (*) 필드가 제거됩니다. 출력이 별개의 레코드처럼 보이지 않습니다. 행이 복제됩니다.

왜이 'count'필드를 제거하면 Postgres 쿼리에서 이런 식으로 출력이 왜곡 될 수 있습니다.

+1

이것은 의미가 없습니다. 그것은 매우 의심 스럽습니다. 나는 다른 일이 벌어지고있는 것 같아. –

+0

그래서 추가 행이 무엇인지 확인 했습니까? – zerkms

+0

나는 이것을 재현 할 수 없다. (작은) 데이터 세트를 제공함으로써이 문제를 보여주는 최소한의 예를 제공 할 수 있습니까? 사실, 훨씬 작은 데이터 세트로이 문제를 재현 할 수 있습니까? – Evert

답변

1

나에게 맞지 않습니다. PostgreSQL 그룹은 동시에 집계를 수행합니다. 그래서 다른 일이 계속되어야합니다. 다음은 배제 할 사항입니다.

  1. 행의 수를 정확하게 확인하십시오. 메인 쿼리를 cte에두고 count (*)를 선택하면됩니다. 다음은 그 예입니다.

  2. 쿼리 계획을 확인하십시오. 귀하가 고려하지 않은 조인 프로젝션 문제가 있습니까? explain은 귀하의 친구입니다. 예를 들어

:

with query (
    select PK1, PK2, count(*) cnt 
    from mytable 
    group by PK1, PK2 
    ) 
    select count(*) from query; 
1

이 당신이 당신의 수수께끼를 해결하는 데 사용할 수있는 몇 가지 작업은 다음과 같습니다

:

먼저 당신이 당신의 테이블의 행의 정확한 수를 가지고 있는지 확인

select count(*) from mytable 

다음에 보유하고있는 고유 한 PK1 및 PK2 값의 수를 확인하십시오.

select count(*) from (select distinct PK1 from mytable) a 

select count(*) from (select distinct PK2 from mytable) a 

두 값이어야 하나 동등 (당신이 고유 키 테스트), 또는 매우 작은 (그들 중 누구도 고유 키 없음), 총 수보다.

이어서 결합 열쇠에 대해 계산 테스트 :

select count(*) from (select distinct PK1, PK2 from mytable) a 

결과 값 중 하나와 동일 ((PK1, PK2)는 고유 키이다), 또는 상당히 작은 ((PK1, PK2)가 아닌되어야 고유 한 키)를 사용합니다.

다음 쿼리는 당신에게 이전보다 동일한 번호를 제공해야합니다 :

select count(*) from (
    select PK1, PK2 
    from mytable 
    group by PK1, PK2) a 

다시 다음

마지막으로
select count(*) from (
    select PK1, PK2, count(*) 
    from mytable 
    group by PK1, PK2) a 

에서 같은 값을, 다음은 당신에게 정확한을 주어야한다 총 카운트와 같은 번호 :

select sum(cnt) from (
    select PK1, PK2, count(*) as cnt 
    from mytable 
    group by PK1, PK2) a 

어느 시점에서든지 예상 결과를 제공하지 않으면 데이터가 심각하게 손상됩니다.

+0

제안한대로 이러한 쿼리를 실행했지만 여전히 동일한 오류가 발생합니다. 저는 성명별로 내 그룹을 중심으로 "셀렉트 카운트 (*)"를 래핑하는 것이 좋다고 생각했지만 여전히 큰 실수를 얻었습니다. 흠. – user1399233

+0

@ user1399233이 시점에서 신비한 사건에 대한 지원을받는 유일한 방법은 테이블의 DDL로 질문을 업데이트하는 것입니다. 그리고 각각에 대해 (분석 분석을 포함하여 더 나은 결과를 얻을 수있는) 정확한 결과를 얻을 수 있습니다 이 쿼리들 중 하나. –