
はじめまして、SQLもMYSQLも初心者です。 独学で、1,2か月といったところでしょうか
MYSQL5.5.を使用しています。
早速ですが質問です。
自己結合のもとになるクエリが複雑?な場合どうすれば負荷の少ないクエリが組めるでしょうか?
自己結合したいクエリが、相関サブクエリをつかっているためViewが作れないので
素人考えで、もととなるクエリをSQL中に何回も記述してみましたが、
メモリがオーバーフローしてしまいます。
複雑なクエリをスマートに自己結合する方法はないのでしょうか?
それとも、そもそも、最初に自己結合や外部結合でめいいっぱいデータを展開し、それを相関サブクエリ.etcで、漸次、絞り込んでいくほうが、SQLの手段としては正しいのでしょうか?
他で上記のクエリのかなりの部分を使用するので、再利用できないかと思って組んでみましたが
行き詰まり、色々と自信がなくなってきました、アドバイスをお願いします。
以下やりたいことです
暇だったら見てください。
勉強も兼ね、カレンダーアプリで担当者ごとの抱えているプロジェクトと、忙しさ、割ける時間、効率性
を可視化することを目的としたソフトをつくろうと思っています。そこで、日にちごとに、不特定の時間帯から、時間の重複を許して、複数の時間帯を除した、あまりの時間を求めるクエリを組もうと思い、web上で勉強して、相関サブクエリと、自己結合とHAVING文などを組み合わせれば、実現可能なことがわかりました。そこで、相関図を書いて、実際に作って見たのですが、上記のようになった次第です。ぜひ、皆様のお知恵を拝借したいしだいです。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
データの結合は相乗的にデータが増えるので、自己結合などで
条件設定を冗長にやっていると処理時間が膨大になったり
メモリを食い過ぎたりなど当然想定しなくてはいけませんね
>独学で、1,2か月
で、このレベルの質問ができるとすると、相当基礎的なスキルがあるかとは
思いますが、まずはSQLの基本である正規化について知識を深めて、
インデックスなどをためしながらexplainでテストしていく
というのが流れになると思います。
また簡易なデータ参照についてはエンジンも思い切ってMyISAMなどで
処理することで高速化をはかるとか、データ更新がおおくなかったり
完全なリアルタイム性が必要でないものは中間テーブルをつくって
高速化することはできるかと思います。
プロジェクト管理についてはガントチャートやパートチャートの考え方を理解し、
プロジェクトのパートごとに人月設定をしたうえで、アサインするユーザーに
配分の係数を掛けていくと進捗がだせると思いますので
プロジェクトテーブル、ユーザーテーブル、プロジェクト=ユーザーアサインテーブル
などに分けて処理すれば効率的にいけるかもしれません。
期間の処理はプロジェクトに寄せるか、さらに別テーブルで管理するかは
出力したい帳票によりますね
回答、そしてアドバイスありがとうございます。
>>完全なリアルタイム性が必要でないものは中間テーブルをつくって高速化
やっぱりそれしかないのですかね、テーブルを全更新しているとスピードが使用に耐えないので(explainでテストしてみるべきですけど)
トリガつけて差分更新かぁ、そうするとデータの整合性が心配になってくるから、どこでどんなチェックをいれればいいのかなー。それに、メモリ制約結構外れて、汎用性あげられるよな、設計見直さな。むしろ仕様から変更したほうがいいのか?
みたいな
全行程を自分一人でやる(さらに使用者(のうちの一人)も、保守も、利益を得るのも自分)特有の悩みが。むしろ贅沢な悩みかもしれませんがw
抜本的な仕様変更も視野に入れ考えてみます。
あと、ガントチャートいいですよね。
プロジェクトといっても少人数で、そんな複雑じゃなく、むしろ複数同時進行で、突発的に予定が入る
という仕様上ガントチャートは考えておりませんでした、が余力があれば、インターフェース兼出力帳票として検討してみたいと思います。夢がひろがります、また、仕様が変わりそうですが。
No.1
- 回答日時:
MySQLはサブクエリに弱いという話を良く聞きます。
※参考URLを貼っておきます。
私の場合、複雑な処理を書く場合は、後でメンテナンスする人の事も考えてなるべくシンプルに書く努力をします。
複雑なSQL文を使って一発で答えを得るより、簡素なSQLを複数回実行させたほうが、見た目にもキレイになるし、
後でのメンテナンスも楽になると思っているからです。
すみません、回答になっていないかも知れませんが・・・。
参考URL:http://el.jibun.atmarkit.co.jp/garyotensei/2012/ …
早速の回答ありがとうございます。
>>MySQLはサブクエリに弱い
indexの取り方がところどころおかしいとも聞きます、それも関係するのでしょうか。
webの評価を見ている限りフリーでは最強だと思うのですが、商用DBも考えたほうがいいのか。
>>後でメンテナンスする人の事も考え、なるべくシンプルに書く努力
>>複雑なSQL文を使って一発で答えを得るより、簡素なSQLを複数回実行させたほうが、見た目にもキレイになるし、後でのメンテナンスも楽になると思っているからです。
耳が痛いですw自分用に、ここまで集合を広げ、こういった特性関数で絞り込むみたいな設計で可視化は
やってますが、後の人ことは考えてないです、精進します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
- MySQL ある時間以内の利用者の抽出について 3 2022/03/26 11:15
- その他(データベース) accessについて 2 2022/05/31 16:58
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Oracleで上書きImportはできま...
-
BULK INSERT
-
Accessのインポートについて(上...
-
Accessのテーブルデータを一気...
-
Accessでデータシートに同じデ...
-
フィールドの設定
-
処理の途中で停止させ、再開さ...
-
ODBC接続で新しいレコードを追...
-
DBアプリケーションの設計方針 ...
-
SQL文の書き方について
-
2つのテーブルからレコードを...
-
SQL文の結合(一対多)がわから...
-
MySQLのチューニングについて
-
accessのヘッダーについて
-
アクセス レコードセットを更...
-
マテリアライズドビューとスナ...
-
結合テーブルでINSERTする方法...
-
このISAMでは、リンクテーブル・・
-
sql serverのテーブルレイアウ...
-
複雑なクエリの自己結合について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Oracleで上書きImportはできま...
-
このISAMでは、リンクテーブル・・
-
テーブルで一番古いレコードだ...
-
ビューのソートについて
-
アクセス レコードセットを更...
-
Accessのテーブルデータを一気...
-
accessでレコード更新直後の反...
-
マテリアライズドビューとスナ...
-
結合テーブルでINSERTする方法...
-
ユニオンクエリで複数ファイル...
-
ORA-01401が表示され、データが...
-
ERROR1062:Duplicate entry.......
-
住所のDBテーブル、マスターの...
-
Accessでの稼働日数計算の方法
-
ACCESSで容量が50MBになった...
-
VBAでSQLServerへのODBC接続
-
ODBC接続で新しいレコードを追...
-
処理の途中で停止させ、再開さ...
-
「クリップボードにコピーされ...
おすすめ情報