2017-01-27 3 views
2

私のテーブルで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; 
+0

なぜあなたは 'active'にインデックスを追加しないのですか? –

+4

**あなたの質問を** [編集] **してください**高速実行のための** '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) –

+0

@TimBiegeleisenより。私は列 "アクティブ"のインデックスを作成し、クエリは13秒後に終了するようになりました。これは幾分受け入れられます。インターネット上のほとんどの言及は、ブール値の列にインデックスを作ることに意味がないと言っています。テーブルは250.000以上の行ではなく、12.000以上の行が「アクティブ」です。 –

答えて

1

: は思考の数時間後、私は、WITH句を使用して、このソリューションで出てきました初期テーブル。 pk.activeとpo.datumのインデックスが絶対に役立ちます。 po.datumを場所の代わりに内部結合に入れることを検討してください。

po.datum>='2017-01-26' 
AND po.datum<='2017-01-26' 
AND pk.tip='p' 
AND pk.active = TRUE 

は次のようになります。

pk.active = TRUE 
AND pk.tip='p' 
AND po.datum>='2017-01-26' 
AND po.datum<='2017-01-26' 
+0

注文とはどのような違いがありますか? –

+0

whereでの順序は、クエリの実行順序に影響を与える可能性があります。データベースが250000行の238000行を無視することができる場合(上記のコメントを参照)、最初の行の後には高速になります。左側のテーブルのブール値をチェックするのは、右側のテーブルの2つの日付フィールドをチェックするよりも速いです。 – verhie

+0

@Bojanこれを試してみて、何が起こったか教えてください –

関連する問題