Access VBA質問箱 IV

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

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


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

【3514】クエリの処理時間短縮について Tomato 04/9/15(水) 13:37 質問[未読]
【3515】Re:クエリの処理時間短縮について SIA 04/9/15(水) 14:05 回答[未読]
【3516】Re:クエリの処理時間短縮について Tomato 04/9/15(水) 15:00 質問[未読]
【3519】Re:クエリの処理時間短縮について こもれび 04/9/15(水) 20:03 回答[未読]
【3528】Re:クエリの処理時間短縮について Tomato 04/9/16(木) 12:30 お礼[未読]
【3532】Re:クエリの処理時間短縮について こもれび 04/9/16(木) 16:11 回答[未読]
【3533】Re:クエリの処理時間短縮について(追伸) こもれび 04/9/16(木) 16:16 発言[未読]
【3543】Re:クエリの処理時間短縮について tomato 04/9/17(金) 22:57 お礼[未読]
【3546】Re:クエリの処理時間短縮について YU-TANG 04/9/18(土) 12:45 発言[未読]

【3514】クエリの処理時間短縮について
質問  Tomato  - 04/9/15(水) 13:37 -

引用なし
パスワード
   データ量が膨大なため、処理時間の短縮を図っております。
処理としては、以下の条件でデータを抽出したいです。

<条件>
TableA:ID, Date, ItemA  IDは重複なしです
TableB:ID, Date, ItemB  IDは重複してます
TableA.IDとTableB.IDが同一で、TableB.DateはTableA.Dateより小さいけれども
TableBの中では最大なものを抽出。

現状の処理としては、以前【3365】にて教えて頂いたように

SELECT TableA.ID, TableA.ItemA, TableB.ItemB FROM TableA, TableB
WHERE (TableA.ID=TableB.ID AND
TableB.Date=(SELECT Max(Date) FROM TableB WHERE TableB.Date<TableA.Date))

にて抽出を行なっているのですが、少しでも処理時間を短縮したいと思っています。
上記以外に少しでも処理時間がかからない方法をご存知でしたら教えていただきたいです。
よろしくお願いいたします。

【3515】Re:クエリの処理時間短縮について
回答  SIA  - 04/9/15(水) 14:05 -

引用なし
パスワード
   TableBがもしも自前で作成しているものならば、最初からTableBに書き込む際にIDが重複
しないように、MAXを調べてから書き込んでみたらどうでしょうか?

【3516】Re:クエリの処理時間短縮について
質問  Tomato  - 04/9/15(水) 15:00 -

引用なし
パスワード
   ▼SIA さん:
>TableBがもしも自前で作成しているものならば、最初からTableBに書き込む際にIDが重複
>しないように、MAXを調べてから書き込んでみたらどうでしょうか?

ご返信、ありがとうございます。
TableB.DateのMaxではなく、TableA.Dateよりも小さいMaxを探す必要があるのです。
TableA.Dateを参照せずにTableBのMaxを調べることができないので、
このような処理になっています。
何かいい案がありますでしょうか?

【3519】Re:クエリの処理時間短縮について
回答  こもれび  - 04/9/15(水) 20:03 -

引用なし
パスワード
   こもれびです、 こんにちは(^^)/

テーブルのインデックスはどのようになっていますか?
インデックスがIDだけだったりすると遅くなります。

TableB.Date
TableA.Date

これらにインデックスを付けると速くなるのではないかなと思います。

【3528】Re:クエリの処理時間短縮について
お礼  Tomato  - 04/9/16(木) 12:30 -

引用なし
パスワード
   どうもありがとうございます。
インデックスを付けるという考えがまったく浮かびませんでした。
インデックスの付け方は、Create index 文でつけるのですよね。
CREATE INDEX IND_ID_Date ON TableA(ID, Date);
では構文エラーがでます。
ID単独には付けることができるのですが、Dateには付けれません。
日付型には付けることができないのでしょうか?
度々の質問ですが、よろしくお願いいたします。

【3532】Re:クエリの処理時間短縮について
回答  こもれび  - 04/9/16(木) 16:11 -

引用なし
パスワード
   こもれびです

▼Tomato さん:
>インデックスの付け方は、Create index 文でつけるのですよね。

いや…その〜 (^^;

テーブルのデザイン画面のメニューバー[表示]−[インデックス]で
確認し、設定してください。
おそらく現在はidだけになっているのではないかと思います。

VBAでは設定しなくてよいです。

【3533】Re:クエリの処理時間短縮について(追伸)
発言  こもれび  - 04/9/16(木) 16:16 -

引用なし
パスワード
   こもれびです

私のところでは日付型でインデックスをつけることが出来ております。

【3543】Re:クエリの処理時間短縮について
お礼  tomato  - 04/9/17(金) 22:57 -

引用なし
パスワード
   ▼こもれび さん:
>テーブルのデザイン画面のメニューバー[表示]−[インデックス]で
>確認し、設定してください。

お返事ありがとうございます。
インデックスの設定をVBAで行ないたい為、
SQL文になってしまうのです。
何度やっても、Dateにインデックスはつきませんでした・・・

でも、IDにインデックスをつけたことにより格段に
スピードアップいたしました。
どうもありがとうございます。

【3546】Re:クエリの処理時間短縮について
発言  YU-TANG WEB  - 04/9/18(土) 12:45 -

引用なし
パスワード
   こんばんは、YU-TANG です。

> 何度やっても、Dateにインデックスはつきませんでした・・・

蛇足ですが。

「Date」は Jet-SQL の予約語とバッティングしている名前です。
[Date] と大括弧で括ることによってパラメータとして認識してくれるかも
しれませんが、それでもあまり望ましい状態とは言えません。
非常に危険なので、可能であれば予約語とバッティングしない別の名前に
変更することをお勧めします。

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