私は大部分のクエリをcteとして開発しましたが、特定の部分では、処理されるレコードの数を最小限に抑えるために内部結合を使用して2次テーブルの合計を作成する必要がありました。集計レコードの一部がpostgresql内部結合いくつかのレコードを複製する
私は内部使用する必要が8回は参加したり、応答時間が15倍以上の倍
with
p0 as (select distinct on (pventa) pventa, p.tipo tpva from lecturas l
left join puntoventa p on l.pventa=p.numero where dia between '2017-10-01' and '2017-10-31' and p.tipo in ('A','E')),
r1 as (select p.tpva, l.pventa, dia, turno from lecturas l
inner join p0 p on p.pventa=l.pventa
where dia between '2017-10-01' and '2017-10-31'),
p1 as (select pva, remision, sum(abono), count(abono) from pagosremisiones p
inner join movsgas m on p.pva=m.pventa and p.remision=m.folio
inner join r1 r on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno group by 1,2 order by 1,2),
f1 as (select c.serie, c.factura, sum(abono), count(abono) from chequefactura c
inner join movsgas m on c.serie=m.serie and c.factura=m.factura
inner join r1 r on r.pventa=m.pventa and r.dia=m.dia and r.turno=m.turno group by 1,2 order by 1,2)
select * from p1
Npremによって空に撮影され、ためにncheckをデバッグしている重複
P 1とf1はr1に依存しますが、p1は重複したレコード(npremは既存のレジスタに対応します)なしで動作しますが、ncheckは実際の値の8倍まで増加します
私はそう、正しいP1の結果が純粋にカジュアルであり、F1
で重複を修正する方法がわからない場合、私は直接サブクエリを行うための代替手段を持っていますが、私は使用することに教訓的な関心がところで
に参加していわかりません直接的なサブクエリは、構造が不十分なために結合よりもはるかに効率的です
私は間違って何をしていますか?
コードを最適化するにはどうすればよいですか?予め
おかげ
ホセ
それはかなり不明です。より簡単なクエリと、問題を示すサンプルデータを簡単に再現することができますか? –
申し訳ありませんLawrewnz、ここではかなり大きかった – glicuado
コードはオプトマイズされていない、または重複しているという問題/質問ですか?今はちょうど一連のサブクエリです。重複を取得している場合は、参加しているものが少なくとも1つの結合されたテーブル/サブクエリで一意ではないことが示唆されます。すべてのデータを見ることなく、データの問題として診断する方法はありません。さらに、あなたの 'f1' CTEが書かれているように、余分です。それはなぜここに含まれていますか?それは非常に混乱しています。 – JNevill