tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルADO のJOIN数の実質上限?
記事No15062
投稿日: 2010/12/15(Wed) 09:18
投稿者IMA
VB6の問題でなく、ADO SQLの質問になりますが、宜しければ
ご教示ください。
→ 不可なら投稿削除させていただきます。

下記のテーブルが有るとします。AccessMDB形式です。
■ T_Index
 index:長整数・・1〜1000まで

■ T_Data01 〜 T_Data20
 index:長整数・・1〜1000まで
 Flag:長整数(実質 0 又は -1)

この、T_Index と T_Data01 〜 T_Data20のデータを
下記のような横に繋げた一覧表を作製しようとしています。

index    T_Data1.Flag    T_Data2.Flag・・・T_Data20.Flag

ADODB.Recordsetの利用ですが、T_Dataを14個程度までは、殆ど
時間を気にせずに開くのですが、→ 1sec以内?
それから加速度的に遅くなり18個繋げると60sec位にもなります。

下記コードは実データを少し直してありますので書き損じがあるかも(汗

Dim rs As adodb.Recordset

        Set cn = New adodb.Connection
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & sPath & ";" & _
                        "Extended Properties='Text;HDR=NO'"

        sQuery = "SELECT T_Index.index"
        For n = 0 To 19        '14個程度までは遅くない!
            sQuery = sQuery & ", T_Data" & Format(n + 1, "00") & ".Flag"
        Next
        sQuery = sQuery & " FROM " & String(19, "(")
        sQuery = sQuery & "T_Index LEFT JOIN T_Data01" & _
                          " ON T_Index.index = T_Data01.index"
        For n = 1 To 19
            sQuery = sQuery & ") LEFT JOIN T_Data" & Format(n + 1, "00") & _
                     " ON T_Index.index = T_Data0" & Format(n + 1, "00") & ".index"
        Next
        sQuery = sQuery & ";"

        Set rs = New adodb.Recordset
        rs.Open sQuery, cn

ちなみに、Access2003のクエリ窓?で処理するとDAO?の為か1/10位の時間ですが
遅くなることに変わり有りません。

また、クエリを2に分けて記載し、その2つをJOINしたところ大幅に処理速度が
向上しました。→ 1sec位?

SQL文の見直しで1つのSQL文でも速くなるでしょうか?

よろしくお願いします。

[ツリー表示へ]
タイトルRe: ADO のJOIN数の実質上限?
記事No15063
投稿日: 2010/12/16(Thu) 06:38
投稿者IMA
今回のAccessMDB形式のテーブルのインデックスは全て同一で
漏れもない状態であったので、下記のようにすることで一応
解決できました。・・・市販パッケージソフトのMDBです。

最初の質問の際のJOIN
→ 所謂、スター配線?的にT_Indexに全てのT_DataがJOINされている
 T_Index→T_Data01
 T_Index→T_Data02
 T_Index→・・・
 T_Index→T_Data20
改変版:殆ど瞬時に表示できました
→ 所謂、バス配線?的にT_Indexから順にT_IndexがJOINされている
 T_Index→T_Data01→T_Data02→・・・→T_Data20

但し、T_Data側が0のデータは格納しない形式(T_Indexのデータ数が異なる)
では対応できませんので引き続き情報をお待ちします。

[ツリー表示へ]