私はテーブルを持っているとorder
言う
id | clientid | type | amount | itemid | date
---|----------|------|--------|--------|-----------
23 | 258 | B | 150 | 14 | 2012-04-03
24 | 258 | S | 69 | 14 | 2012-04-03
25 | 301 | S | 10 | 20 | 2012-04-03
26 | 327 | B | 54 | 156 | 2012-04-04
clientid
client
テーブルに戻る外部キーですitemid
item
テーブルに戻る外部キーですtype
B
または_S
amount
整数です
とテーブルprocessed
として
id | orderid | processed | date
---|---------|-----------|---------
41 | 23 | true | 2012-04-03
42 | 24 | true | 2012-04-03
43 | 25 | false | <NULL>
44 | 26 | true | 2012-04-05
order
同じclientid
上で同じもののすべての行date
が反対のtype
値を持つようにする必要があります。type
2つの値のうちの1つのみを持つことができることに注意してください-B
またはS
。上記の例では、これは行23
と24
です。
もう1つの制約は、の対応する行が。に対応しているprocessed
必要があることtrue
ですorderid
。
これまでの私の質問
SELECT c1.clientid,
c1.date,
c1.type,
c1.itemid,
c1.amount,
c2.date,
c2.type,
c2.itemid,
c2.amount
FROM order c1
INNER JOIN order c2 ON c1.itemid = c2.itemid AND
c1.date = c2.date AND
c1.clientid = c2.clientid AND
c1.type <> c2.type AND
c1.id < c2.id
INNER JOIN processed p1 ON p1.orderid = c1.id AND
p1.processed = true
INNER JOIN processed p2 ON p2.orderid = c2.id AND
p2.processed = true
質問:結合句の一部としてを保持するprocessed = true
と、クエリの速度が低下します。WHERE句に移動すると、パフォーマンスが大幅に向上します。これは私の興味をそそりました、そして私は理由を知りたいです。
主キーとそれぞれの外部キー列にはインデックスが付けられますが、値列(など)value
にはインデックスが付けprocessed
られません。
免責事項:私はこのDB構造を継承しており、パフォーマンスの違いは約6秒です。