2017-12-22 14 views
1

私は、大きなSQL式と複雑なクエリを生成するシステムを作成しています。 コードジェネレータを使ってコードを単純化し、少し読みやすくする(https://pastebin.com/UZJ01Q19CTE(Withステートメント)はPostgreSQLで共通の下位式を排除できますか?

いくつかの場所では、任意の数の倍の複雑な部分式の結果を再利用し、ComplexQueryはこの式で二回評価された場合の例

WITH ... AS <DoSetup>, 
intermediate AS <ComplexQuery> 
SELECT a, b FROM 
    (SELECT * FROM intermediate WHERE ...) 
    UNION 
    (SELECT * FROM intermediate WHERE ...) 

ため、への道があり、中に私は、バインドされた式が評価された回数思っていました一度しか評価しないように表現を書き直す?私は一時的なビューを作成しましたが、それはすべてのアクセスでサブクエリを再評価するようです。

答えて

2

CTEを使用するときは、ビューを使用するたびにサブクエリを再実行しないと確信しています。クエリを一度評価し、複数回参照する必要があります。 Explainプランを実行すると、基本表に一度だけアクセスすることが示されます。

enter image description here

私は、トピックに関する権限はないよ、と私は、誰かが私を修正すること、これは間違って読んでいる場合、私は信頼しています。

上記の例が関連性のあるものであれば、簡単なOR節でCTEとの結合を避けることができます。それはこのようになりますたとえば、: - 労働組合という

select * 
from intermediate 
where 
    (a = 1 and b < 50) or 
    (a >= 0 and c > 99) 

ここでも、多分あなたの例では、根本的に単純化されましたが、私はこれをたくさん見ています:

select * from intermediate where a = 1 and b < 50 
union 
select * from intermediate where a >= 0 and c > 99 

あなたは、単にことを書き換えることができorとしてよりうまくいくでしょう。 unionには並べ替えが含まれていることに注意してください。これは計算コストがかかります。

+0

ありがとう、私の例は実際には単純化されています - 私はちょうどクエリを複数回再利用する簡単な方法を選びたがっています。しかし、それは私が頭に浮かべるものです。 – Xandros

関連する問題