アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQLの書き方の質問です。

売上Tと商品Mというテーブルがあったとして、
売上Tには商品コード、数量、金額という項目が
商品Mには商品コード、単価という項目が
それぞれあったとします。

売上Tの金額=売上T.数量×商品M.単価

この売上Tの金額を更新するのに、update文でできるだけシンプルに高速に動くSQL文を作成したいのですが、どのような書き方がよいと思いますか?

件数は例えば売上が100万件、商品が10万件あった場合を想定して。

以上よろしくお願いいたします。

A 回答 (1件)

普通に書けばいいんじゃないですか?


この構成なら商品コードに索引がついていると思うので。
実行計画もつけました。

UPDATE 売上T a
SET ( a.金額 )
=
(SELECT a.数量 * b.単価
FROM 商品M b
WHERE a.商品コード = b.商品コード
)
WHERE EXISTS (SELECT 'X'
FROM 商品M x
WHERE x.商品コード = a.商品コード
);

実行計画
----------------------------------------------------------
Plan hash value: 4109107743

--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 10 | 3 (34)| 00:00:01 |
| 1 | UPDATE | 売上T | | || |
| 2 | NESTED LOOPS | | | || |
| 3 | NESTED LOOPS | | 1 | 10 | 3 (34)| 00:00:01 |
| 4 | SORT UNIQUE | | 1 | 3 | 1 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | IDX_商品M_0| 1 | 3 | 1 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_売上T_0| 1 | | 0 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID| 売上T | 1 | 7 | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | 商品M | 1 | 5 | 2 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | IDX_商品M_0| 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

6 - access("X"."商品コード"="A"."商品コード")
9 - access("B"."商品コード"=:B1)

統計
----------------------------------------------------------
0 recursive calls
1 db block gets
5 consistent gets
0 physical reads
0 redo size
696 bytes sent via SQL*Net to client
844 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
1 rows processed
    • good
    • 0
この回答へのお礼

回答どうもありがとうございます。
わざわざ実行計画まで付けていただき感謝します。
existsやinを使うのに不安があったのですが、これ見ると
当然のようですが、tableのscanではなくindex full scanとなっているようなので、性能上問題なさそうですね。

どうもありがとうございました。

お礼日時:2008/06/20 09:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す