Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

タイトルコード訂正 & 実験結果
記事No: 25218
投稿日: 2006/05/08(Mon) 01:35
投稿者: hatena
コードに間違いがありました。

> Public Sub MakeMaster()
> Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset
> Dim i As Long
>
> Set rs1 = CurrentDb.OpenRecordset("TBマスタデータ")
> Set rs2 = CurrentDb.OpenRecordset("TBマスタデータ2")
>
> rs1.MoveFirst
> Do While rs1.EOF
   ↑ここを
Do Until rs1.EOF
に訂正します。

> For i = Val(rs1!開始番号) To Val(rs1!終了番号)
> rs2.AddNew
> rs2!番号 = Format(i,"00000")
> rs2!商品名 = rs1!商品名
> rs2.Update
> Next
> rs1.MoveNext
> Loop
>
> rs1.Close
> rs2.Close
> End Sub
>
> 5桁の番号ですので最大10万件のレコードですから、たいして時間は
> かからないでしょう。

ついでに、サンプルデータを乱数を使ったコードで作成して、
実験してみました。
TBデータ10万件、TBマスタデータ15000件 のデータを作りました。

たかぷーさんの最初の直積を使ったSQL、
銀の匙さんの不等結合のSQL、
みるくさんのサブクエリを使ったSQL
では、数分待っても件数が出ないので、強制終了させました。
TBデータを200件に制限した場合、どのSQLでも件数がでるまで
12秒ほどかかりました。

等価結合にできないようなテーブル構成では、実用的な速度は難しいようです。

上記のコードで、等価結合できるようなマスタテーブルに変換するのに、
30秒ほどかかりました。このマスタテーブルで等価結合した場合、10万件の
データテーブルでも5秒程度で件数が表示されました。


※追加補足
TBマスタデータ の、開始番号、終了番号 にインデックスを設定しての
実験です。

タイトルRe^6: 大量データ処理ができないーっ!!
記事No: 25214
投稿日: 2006/05/07(Sun) 21:39
投稿者: 銀の匙
こんばんは。

コストを下げるならインデックスは必須ですね。

クエリーも不等結合の方が望ましいと思われます。

SELECT TBデータ.番号, TBマスタデータ.商品名
FROM TBマスタデータ INNER JOIN TBデータ
ON ( TBデータ.番号 BETWEEN TBマスタデータ.開始番号 AND TBマスタデータ.終了番号 )
;

タイトルRe^7: 大量データ処理ができないーっ!!
記事No: 25217
投稿日: 2006/05/08(Mon) 00:27
投稿者: たかぷー
みなさま
有難うございます。

インデックスを作ることを試してみます。
また、分からなくなったらお助け下さい。
本当に有難うございました。

> こんばんは。
>
> コストを下げるならインデックスは必須ですね。
>
> クエリーも不等結合の方が望ましいと思われます。
>
> SELECT TBデータ.番号, TBマスタデータ.商品名
> FROM TBマスタデータ INNER JOIN TBデータ
> ON ( TBデータ.番号 BETWEEN TBマスタデータ.開始番号 AND TBマスタデータ.終了番号 )
> ;

[前頁]

このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

cPanel共有レンタルサーバーをディスカウント価格で提供中...。専用レンタルサーバーも取り扱っています。 : 萬サーバー屋
cPanel共有レンタルサーバーをディスカウント価格で提供中...。
専用レンタルサーバーも取り扱っています。
入門機器プランとして最適なラインナップを取り揃えています。

 

ページの先頭へ 前ページへ戻る