[解決済み] スケーラビリティを考えるとき、なぜ結合はよくないのか?
質問
なぜ結合は悪いのか、遅いのか。私はこれを何度も聞いたことがあります。私はこの引用を見つけた
<ブロッククオート問題は、結合が比較的 特に非常に大きなデータセットでは 遅い場合、ウェブサイトも遅くなります。 ウェブサイトが遅くなることです。そのため をディスクから取り出して ディスクから情報を取り出し、それらを また一緒にするのに長い時間がかかります。
私はいつも、特にPKを調べるときに速いと思っていました。なぜ「遅い」のでしょうか?
どのように解決するのですか?
スケーラビリティとは、作業単位あたりのリソースの使用を最小限に抑えるために、事前計算 (キャッシュ)、分散、または繰り返される作業の必要最低限への縮小をすべて意味します。うまくスケーリングするには、大量に必要でないことは何もせず、実際に行うことはできるだけ効率的に行うようにします。
この文脈では、もちろん、2つの別々のデータソースを結合することは、少なくとも結合しない場合と比較して、比較的遅いです。
しかし、その代わりに、2 つの別々のデータをまったく持たなくなることを忘れないでください。2つの異なるデータを組み合わせることは、どこかで結果を伴わないので、トレードオフを理解していることを確認してください。
良い知らせは、最新のリレーショナル データベースは 良い であることです。優れたデータベースをうまく使えば、結合が遅いと考える必要はないでしょう。スケーラビリティに適した方法はいくつもあります。 多くの より速くなります。
- 自然キーではなく、サロゲートキー(autonumer/identityカラム)で結合します。これは、結合操作中の比較の規模が小さくなる (したがって速くなる) ことを意味します。
- インデックス
- マテリアライズド/インデックス付きビュー (これは事前計算されたジョインまたは マネージド 正規化解除)
- 計算されたカラム。これを使用して、Joinのキーカラムをハッシュ化したり、その他の方法で事前計算することができます。Joinでは複雑な比較になるものが、はるかに小さくなり、事前インデックスが付く可能性があります。
- テーブル・パーティション (複数のディスクに負荷を分散させることで、大規模なデータセットに役立ちます。また、テーブル・スキャンをパーティション・スキャンに制限することもできます)
- OLAP (特定の種類のクエリー/結合の結果を事前に計算する。とは言えないが、次のように考えることができる。 汎用 非正規化)
- レプリケーション、可用性グループ、ログシッピング、または複数のサーバーが同じデータベースの読み取りクエリに応答するためのその他のメカニズムにより、ワークロードを複数のサーバー間でスケールアウトします。
- Redis のようなキャッシュ層を使用し、複雑な結合を必要とするクエリの再実行を回避します。
私はここまで言って リレーショナルデータベースが存在する主な理由は、効率的に結合を行うことができるようにするためです。 * . 構造化されたデータを保存するためだけではありません(csvやxmlのようなフラットファイル構造でも可能です)。私がリストアップしたオプションのいくつかは、事前に結合を完全に構築することも可能です。
もし結合が遅いのであれば、おそらくデータベースを正しく使用していないのでしょう。
正規化解除は、これらの他の手法が失敗した後にのみ行われるべきです。そして、本当に"失敗"を判断できる唯一の方法は、意味のあるパフォーマンス目標を設定し、その目標に対して測定することです。 測定していないのであれば、非正規化について考えるのは時期尚早です。
* つまり、単なるテーブルのコレクションとは異なるエンティティとして存在することです。 本物のRDBMSのもう一つの理由は、安全な同時アクセスです。
関連
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み] SQL/mysql - Select distinct/UNIQUE but return all column?
-
[解決済み】データベースの結合はいつ、なぜ高くつくのですか?
-
[解決済み] ジョインは怠け者のためのもの?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
org.postgresql.util.PSQLException: ERROR: リレーション "userinfo" の列 "loginid" が存在しません。
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] SQLのインデックスとは何ですか?