- 締切済み
履歴データの最終行の抽出
受注テーブル(tbl_Jyutyu)に対する、出荷履歴テーブル(tbl_Rireki)の内、最終行を取得したい。 現在は、以下の様なクエリーで、出荷履歴テーブルの自分自身の出荷回数(intKaisuu)が、最大値の行を集めている。 出荷がない(レコードがない)データもあるため、左方結合している。 目的のデータは出力できるの、速度が出ないためもっといい方法があれば、教えて頂きたいと思い投稿しています。 select J.intJyutyuNo, ... , R.datSyukkaDay from tbl_Jyutyu J left outer join tbl_Rireki R on R.intJyutyuNo = J.intJyutyuNo and R.intKaisuu = (select max(intKaisuu) from tbl_Rireki R2 where R2.intJyutyuNo = R.intJyutyuNo) where J.intJyutyuNo > 0 実際にはもっと複雑で、受注に対する明細、また、発注テーブル等との結合しています。 (これも発注無しデータもあるため左方結合しています。) データ件数は受注数十万件、明細行数百万件あるため、条件によっては、タイムアウトしてしまう。 left outer join が原因、そもそもテーブル設計に問題があるのかも知れませんが、その変更は現在できません。 地道に、速度アップするようにクエリー変更しています。同じクエリーでも、テストデータと現場データでは、 速度が逆転してしまい、苦労しています。 どなたかアドバイス頂ければ幸いです。よろしくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hidebu-
- ベストアンサー率53% (45/84)
いくつか方策はありますが、 あまりにも情報が大雑把なので答えようがないと思います。 チューニングの観点から助言を求めるのであれば、各テーブルのキーや外部キー、データ型がわからないとなんともいえませんし、もちろんSQL全文がないと答えようがありません。 また、 システムアーキテクチャの観点から助言を求めるのであれば実行環境はもちろん、今回の求めたい結果がデータハウスとしての運用されるのか?、それともOLAPの業務運用の一環にもちいられるのか? どこまでリアルタイム性が求められるのか? 等がわからないと答えようがありません。 要件と制約といったシステム全体がわからない第三者が 仕様の一部だけを抜き出して提示され、最適化したいと問われたところで助言をすることは不可能だと思われます。
補足
hidebu-さん、ご回答ありがとうございます。 情報が大雑把で申し訳ありません。 データウェアハウスやOLAPと言ったものは利用していません。MSSQL Server7で単一のデータベース内での運用です。 要件と制約と言われると、どのように説明すればいいのか分からないのですが。 完全にリアルタイムで、検索する必要があります。検索条件を入れて検索のアクションで、動的にクエリーを作成しています。 目的は、分析ではなく、多くの場合には、特定の一件を検索。また多くても数十件の検索することです。 顧客名や電話番号、商品コードや出荷日等を条件として絞り込みます。 受注データ(1受注、1明細)が先に作成され、この受注データに対して、受注番号を持った顧客、出荷、発注等の別テーブルにレコードが後から作成される。 顧客や出荷データが無くても、受注を出力する必要があるため、left outer join のオンパレード、遅くなっても仕方が無い状態です。 ごめんなさい。余計に分かりづらい、概要説明になってしまいました。 他方に無い行を出力するには、left(right) outer join しかないですよね。最近あきらめモードになっています(^^; どうも、ありがとうございました。