違いがある場合、私はApache Derby 10.8を使用しています。select maxを使用する列で結合すると、このSQL(結合)クエリが遅くなるのはなぜですか?
私は非常にシンプルなデータベースを持っています。テーブルにはアイテムがたくさんあり、テーブルにはそのアイテムの入札がいっぱいです。私はそれに加わったその項目の最高入札額を持つすべての項目を選択したいと思います。次はそれで私の最初の試みで、パフォーマンスがひどいです:
select
item.id as item_id,
item.name as item_name,
item.retail_value as item_retail_value,
item.vendor as item_vendor,
bid.bid_amount as bid_amount,
bid.bidder_name as bid_bidder_name,
bid.bidder_phone as bid_bidder_phone,
bid.operator_name as bid_operator_name
from item
left outer join bid on bid.item_id = item.id and
bid.bid_amount = (select max(bid.bid_amount) from bid where bid.item_id = item.id and bid.status = 'OK')
私は、各項目(56400件の入札合計)のための200件の入札で282個のアイテムを使用したテストデータのセットを作成しました。上記のクエリは約30〜40秒で実行されます。すべてのアイテムを選択し、手動で各アイテムの入札単価を高くすると、1秒未満で完了します。
bid.bid_amount
とbid.status
のインデックスを作成しようとしましたが、目立ったことはありませんでした。 SQLは私の最強の領域ではないので、もし誰でも説明しようと思えばなぜその質問がとても遅いのですか本当に感謝します。
+1:サブクエリnippierを作るために 'status、item_id、bid_amount'にINDEXを推奨します。 *(おそらく 'item_id、status、bid_amount'はLEFT JOINにも親切です)* – MatBailie
私はエリックと私の答えがほぼ同じであることを実感しました。エリックのために1つの投票! –
これは、余分なインデックスなしで約半分にまで低下します。助けてくれてありがとう! –