Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録
< anond:20250625194857 |anond:20250625174538 >

2025-06-26

anond:20250625162131

SQLを使って説明してみましょう。

過度なJOINが非効率なケース

提示テーブル構造を例に説明します。

ここで、「Aのデータと共に、関連するBとCのデータも取得したい」という一般的要件を考えます。多くの人が最初に思いつくのは、`JOIN`を使ったクエリでしょう。

SELECT    A.A_id,    A.A_attrs,    B.B_attrs,    C.C_attrsFROM    AJOIN    BON A.B_id = B.B_idJOIN    CON A.C_id = C.C_idWHERE    A.A_id = 'some_a_id'; --特定のAレコードを取得する場合

このクエリは、B,Cの重複が大量発生し、さら属性データサイズが大きい場合は非効率になる可能性があります

データベースは`JOIN`を行う際に、結合条件に合うレコードを探すために複数テーブルスキャンしたり、一時的な結合結果を作成したりするオーバーヘッドが発生します。

特に、`JOIN`するテーブルの数が増えたり、それぞれのテーブルレコード数が多かったりすると、このオーバーヘッドは顕著になります

また、「JOIN乱用するなら第三正規形にする必要ないんだよな」という点も重要です。

第三正規形はデータ冗長性を排除し、データ一貫性を保つための設計原則です。

しかし、その結果としてデータ複数テーブル分散され、結合が必要になります

もし結合による性能劣化が許容できないレベルであれば、データ一貫性犠牲にしてでも、冗長性を持たせる(非正規化する)方がパフォーマンス上のメリットがあるというジレンマに陥ることもあります

しかし、それは正規化のメリットデータ一貫性更新時の不整合防止など)を失うことにもつながります

個別クエリを発行する方が効率的なケース

主張されているのは、以下のようなアプローチです。

1. まずAのデータを取得する。

2. Aのデータから得られた`B_id`と`C_id`を使って、必要に応じてBとCのデータ個別に取得する。

--ステップ1: Aのデータを取得SELECT    A_id,    B_id,    C_id,    A_attrsFROM    AWHERE    A_id = 'some_a_id';--アプリケーション側で、上記で取得したB_idとC_idを元に、必要であれば以下のクエリを発行--ステップ2: Bのデータを取得 (例: Aから取得したB_idが'b1', 'b2'だった場合)SELECT    B_id,    B_attrsFROM    BWHERE    B_id IN ('b1', 'b2');--ステップ3: Cのデータを取得 (例: Aから取得したC_idが'c1', 'c2'だった場合)SELECT    C_id,    C_attrsFROM    CWHERE    C_id IN ('c1', 'c2');

この方法の利点は以下の通りです。

結論として、この程度のことをAI質問できないあなた無能であることが完全証明されました。

Permalink |記事への反応(0) | 02:56

このエントリーをはてなブックマークに追加ツイートシェア

記事への反応 -
  • よくさ、joinすれば簡単だからっつってjoin多用するバカいるじゃん、SQLの話ね でもさ、join乱用するなら第三正規形にする必要ないんだよな A: A_id, B_id, C_id, A_attrs B: B_id, B_attrs C: C_id, C_attrs ...

    • すまん、「効率いい」テーブル設計とsqlのサンプル頼むわ 日本語では主張が理解できんかった

      • SQLを使って説明してみましょう。 過度なJOINが非効率なケース ご提示のテーブル構造を例に説明します。 Aテーブル: `A_id` (主キー), `B_id` (外部キー), `C_id` (外部キー), `A_attrs` (Aの属性)...

      • すまん、「効率いい」テーブル設計とsqlのサンプル頼むわ MANKO

    • Aが1レコードならどっちでも大差ないが、複数レコードなら、所謂N+1問題(ぐるぐるSQL)にならん?

記事への反応(ブックマークコメント)

全てのコメントを見る

人気エントリ

注目エントリ

ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp