내 테이블 plin_korisnik에 나는 부울 유형으로 정의 된 활성 필드가 있습니다. 내가 그 테이블에서 데이터를 두 개의 다른 테이블 가져 오기 위해이 쿼리를 실행하기 위해 노력하고있어Postgres SQL - 부울 필드에 대한 성능 문제
: (같이 영원히, 나는 반 시간 후 중단)
SELECT
pk.omm AS omm,
pk.br_plin AS br_plin,
pk.naziv AS naziv,
pk.ulica||' '||pk.kbr AS adresa,
pk.pu||' - '||pk.naziv_pu AS mjesto,
po.datum AS datum,
CASE WHEN po.stanje >= 999999 THEN NULL ELSE po.stanje END AS stanje,
po.napomena AS napomena,
po.plin_postar AS laus,
pp.ime||' '||pp.prezime AS postar
FROM plin_korisnik pk
INNER JOIN
plin_ocitanje po ON pk.omm = po.omm
INNER JOIN plin_postar pp ON pp.laus = po.plin_postar
WHERE po.datum>='2017-01-26'
AND po.datum<='2017-01-26'
AND pk.tip='p'
AND pk.active = TRUE
ORDER BY po.datum, pk.naziv
하지만 쿼리가 많은 시간에 걸립니다 만, pk.active = TRUE WHERE 절에서 테스트를 제거하면 쿼리가 예상 속도로 실행됩니다. 부울 유형을 정수로 변환하려고했으나 문제가 남아 있습니다.
누군가가이 쿼리와 유사한 쿼리에서 부울 필드를 사용하는 방법을 설명 할 수 있으면 감사하겠습니다. active 필드가 인덱싱되지 않았습니다. 아마도 도움이됩니다.
편집 : 절을 사용 나는이 솔루션과 함께 나온 사고 몇 시간 후 다음 시작,
WITH pk AS (
SELECT * FROM plin_korisnik WHERE active AND tip='p'
)
SELECT
pk.omm AS omm,
pk.br_plin AS br_plin,
pk.naziv AS naziv,
pk.ulica||' '||pk.kbr AS adresa,
pk.pu||' - '||pk.naziv_pu AS mjesto,
po.datum AS datum,
CASE WHEN po.stanje >= 999999 THEN NULL ELSE po.stanje END AS stanje,
po.napomena AS napomena,
po.plin_postar AS laus,
pp.ime||' '||pp.prezime AS postar
FROM pk
INNER JOIN
plin_ocitanje po ON pk.omm = po.omm
INNER JOIN plin_postar pp ON pp.laus = po.plin_postar
WHERE po.datum>='2017-01-26'
AND po.datum<='2017-01-26'
ORDER BY po.datum, pk.naziv;
왜'active'에 인덱스를 추가하지 마십시오? –
** ** [EDIT] ** 귀하의 질문에 ** 빠른 쿼리의 경우 **'explain (analyze, verbose)'**를 사용하여 생성 된 실행 계획을 추가하고 취소 한 쿼리의 경우 간단한 'explain'을 추가하십시오. [** 포맷 된 텍스트 **] (http://stackoverflow.com/help/formatting)하시기 바랍니다. [스크린 샷 없음] (http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-asking-a-question/285557 # 285557) –
@TimBiegeleisen보다. 열 "활성"에 대한 색인을 작성했으며 이제는 13 초가 지난 후에 조회가 완료됩니다. 이는 다소 적합합니다. 인터넷에서 대부분의 참조는 부울 열에 인덱스를 만드는 데 아무런 의미가 없다고 말하고 있습니다. 테이블이 너무 크지 않아 250,000 행 이상 12.000+ 행이 "활성"입니다. –