Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


139 / 2272 ツリー ←次へ | 前へ→

【12877】文字列操作について まゆり 15/7/21(火) 10:29 質問[未読]
【12878】Re:文字列操作について かるびの 15/7/22(水) 1:17 回答[未読]

【12877】文字列操作について
質問  まゆり  - 15/7/21(火) 10:29 -

引用なし
パスワード
   100万件のレコードがあるテーブルがあり、
A列を加工して、主キーになる列を作成します。

▼加工内容(スペースを排除した、左から10桁の文字列)
Public Function sample(str as String) as String
  sample = Replace(Left(str, 10), " ", "")
End Function

ものすごく時間がかかります。
短縮する方法はないものでしょうか。

宜しくお願いします。

【12878】Re:文字列操作について
回答  かるびの  - 15/7/22(水) 1:17 -

引用なし
パスワード
   >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もレコード数をもっと絞り込んで、直積のレコード数を少なくする
というようなことが必要になると思います。

139 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free