初期の記事では、
『SQLでJOINをするよりも、個別にSELECTし呼び出し言語側で結合処理した方が速い場合がある』
という一見直感に反する事実を客観性をもって知らせる為に実験ベースで行いましたが、いささかわかりにくい面がありますので、先ずは理論的な側面からなぜJOINを崩す(個別のテーブルでSELECTし後で結合する)方が有利な面について説明します。
続いて、コメント欄での指摘を元に新たに実験を行ってみます。
注意したいのですが、『JOINを書くのが嫌いだが、JOINを書くことを強制された為、それから逃れるための根拠として本記事を引用する』ということはしないで下さい。RDBを使う上でJOINは避けて通れません。のでがんばって勉強しましょう。
また、『SQLで処理した方が○○より速い』という風に考えておられる方が一部にいらっしゃいます。私の考えを述べますと『ケースバイケース』です。
この記事ではSQLが速いとか特定の言語が速いとか一概に言えないことを指摘します。
理論編記事一覧
JOINのパフォーマンスについての考察1(リレーションとの関係1)
JOINのパフォーマンスについてリレーションの側面から理論的な考察を行います。JOINが効率的かどうかはリレーション(1対1、1対n)が関係してきます。
JOINのパフォーマンスについての考察2(リレーションとの関係2)
JOINのパフォーマンスについての考察1(リレーションとの関係1)を踏まえて、実験をプラスして、もう少し定量的に考察を行います。
RDBのオプティマイザについて(工事中)
RDBはオプティマイザが搭載されているので効率的という意見がありますが、2011年現在のRDBオプティマイザについて考察してみます。
RDBの操作を効率化させるテクニック(工事中)
RDBの発展の歴史は、如何にJOINを高速に処理させるかにあります。そのアイデアはSQLだけでなく他のプログラミング言語にも適用できると考えています。
実験編記事一覧
JOINのパフォーマンス実験環境
様々な実験を行っていましたが、環境が統一していませんでしたので環境を統一させ再度実験を行いました。その環境について示します。
SQLの実行パフォーマンスについて2010
1対n結合の例で、SQLでJOINをするよりも、個別にSELECTし呼び出し言語側で結合処理した方が速い場合の実例をC++の実験で示しています。
プログラムの組み方が悪い場合についてはSQLでJOINさせるよりも圧倒的にパフォーマンスが悪くなる例もあわせて紹介しています。
[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011
プログラミング言語ADPによるSQL(JOIN)のパフォーマンス向上の実験を行っています。
特に前回の実験で、パフォーマンスが悪くなったプログラムをADPのキャッシュ機能を使い、速くした例を示します。
[ADP開発日誌]0.74リリース マルチスレッド化の第一歩 & LLPlanets発表用リリース 同様にADPのマルチスレッド機能(pipe)を使ってJOINを高速化させる例を示します。
JOINのパフォーマンスについての考察2(リレーションとの関係2)
JOINのパフォーマンスについての考察1(リレーションとの関係1)を踏まえて、実験をプラスして、もう少し定量的に考察を行います。
その他記事
以下、一連の議論を通して感じたことを書いています。素直さは如何に大切か
騙されないようにする為に(適切な議論の方法)
真のソフトウェアエンジニアに必要なモノ(SQLは銀の弾か?)