2011/11/09

Win7 + access2003 が遅いと聞いたので

新規に仮想PC作っていたからついでに試してみた。
いろいろ試していて遅い原因はいくつかありそうな気がしたのだけど、特にクエリがあれだ。Jetあたりに問題があろうかと思えて仕方がない。そこで、Win7SP1(64)上でaccess2003がどんな感じになるのかなと検証。64bitを選択したのに深い意味はない。うっかりしてただけ。Win7のSPも公開されてしばらくしたし、ナントカ電機で安く売ってた夏モデルを買ってきたら64bitだったというシナリオというのもありがちかなと。

過去のシングルコアマシンと最新マルチコアマシンで比べたら、非力なシングルコアの方が速かったということもあるし。
XP+a2003 / Win7+a2003 / Win7+a2007 で比較などしてみた。いずれも、SPはすべてあててある。Hotfixはあてていない。マシンはすべて同じ条件
結果が明確にでるからレコードは大目に。5,000,000レコードからフィールド1でフィルタ、フィールド2でソートするクエリで様子を見る。フィールドにはいずれにも重複ありインデックス。2003形式mdb。
Sub test()
    Dim dbs As DAO.Database, rs As DAO.Recordset, i As Long
    Set dbs = CurrentDb
    i = timeGetTime
    Set rs = dbs.OpenRecordset("select * from table1 where F01 = 1000 order by F02;")

'    Set rs = dbs.OpenRecordset("select * from table1 where F01 = 1000;")
'    rs.Sort = "F02"
'    Set rs = rs.OpenRecordset
    
    Do Until rs.EOF
        rs.MoveNext
    Loop
    Debug.Print timeGetTime - i
    rs.Close: Set rs = Nothing
    dbs.Close: Set dbs = Nothing
End Sub
要はこんな感じ。DAOで検証しているけど普通にクエリの操作でも同じ現象が発生するので遅いとされているのだろう。
で、結果。
Win7+a2003の成績が悪すぎる。片対数グラフだからインパクトがちょっと弱いけど、一回のクエリに100ms~50secかかっている。Win7+a2007を見ているのは、SP3でACEに修正が入っていて本来あるべき性能なのであろうという考えたから。XP上でも同様な傾向がみてとれるのだけど、以前から不安定な状態があったが看過されていたのだろうか。ACE12/14いずれも修正されているが、Jetを使用するバージョンはすでにサポート終了しているからJetに修正は来ないということが考えられる。
で、可能な範囲でどうしようかというのは、コード上コメントアウトしている形。すべての環境で80~100msで推移するよい結果が出る。また、ここまで大量のレコードでなければインデックスを張らないというのも選択肢だったりするのかな。フルスキャンになるから基本的に遅いけど5sec程度で安定している気配はあった。
また、今回の検証用mdbをa2007で仕込んでいたのだけど、これをa2003上で開くとかなり重かった。結局、元データはcsvで各バージョン用mdbにインポートして安定させた。詳しく見ることはできなかった点だけど、もしかするとバージョン間のやり取りが調子が悪くなる原因になるのかもしれないと思えた。だが、確証はない。

0 件のコメント: