|
>100万件のレコードがあるテーブルがあり、
このテーブルの名前が「T_A」だとします。
>A列を加工して、主キーになる列を作成します。
この「主キーになる列」のフィールドの名前が「キー」だとします。
>ものすごく時間がかかります。
>短縮する方法はないものでしょうか。
何をするのにものすごく時間がかかるのでしょうか。
T_Aだけを表示させ、かつ、100万レコードを全て表示させるのに時間がかかるというのでしょうか。
それとも、T_Aだけから演算フィールドである「キー」フィールドを表示する
選択クエリ(Q_A)を作り、
「キー」フィールドを結合フィールドに使ってQ_Aと他のテーブル(T_B)とを結合させる
選択クエリ(Q_B)を作り、
このQ_Bクエリを表示させるのに時間がかかるというのでしょうか。
仮に前者だとします。
100万レコードを一度に表示させるなどいうことは無謀に過ぎます。
100万レコードを表示させても、全部に目を通すなど人間業ではほぼ不可能でしょう。
抽出条件をうまく設定して、表示させるレコードをもっと限定しましょう。
仮に後者だとします。
私も内部的な挙動には詳しくないのですが、私が推察しているところでは、
選択クエリというのは、結合させるテーブルの直積をまず作り、
それらの中から結合条件に合致するものを抽出している
という動作が行われているようです。
直積というのは、例えば、Aテーブルに全部で4レコード、Bテーブルに全部で6レコードあるとすると、
Aテーブルの1レコードにつき、Bテーブルの全てのレコードを結合させる組み合わせのことです。
この場合、直積は、4×6=24レコードとなります。
T_Aが100万レコードあり、仮にT_Bに1万レコードあるとすると、
この2つのテーブルから成る直積は、
1,000,000×10,000 = 100億レコード
となります。
したがって、sample関数は100億回実行されることになります。
時間短縮のためには、結合フィールドには演算フィールドを使わないようにするとか、
あるいは、T_AとT_Bと結合させる前に、
T_AもT_Bもレコード数をもっと絞り込んで、直積のレコード数を少なくする
というようなことが必要になると思います。
|
|