私のテーブルで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
が、クエリは多くの時間を要する(のような永遠に、私は半分の時間後にそれを中断)が、
を削除すると、WHERE句からpck.active = TRUEのテストが実行され、クエリは予想される速度で実行されます。ブール型を整数にキャストしようとしましたが、問題は残ります。
誰かがこのようなクエリでブール値フィールドを使用する方法を説明できるのであれば、私は感謝します。 activeフィールドはインデックスに登録されていません。
編集:私はあなたがwhere句で順序を変更した場合、それはより速くで始まるかもしれないと思う
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'にインデックスを追加しないのですか? –
**あなたの質問を** [編集] **してください**高速実行のための** '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以上の行が「アクティブ」です。 –