PAGE TOP

取り組み

印刷する

Access64ビットの壁がわかった

ユニオンクエリでDBを繋ぐ

さぼ郎
毎月、約110万~130万件のデータ処理をAccessで行っています。

処理の内容は、集計要素がいくつかあって、その集計要素に従ってAccessで集計して、その結果をExcelに渡し、グラフを作成することです。

マイクロソフト

Excelには読み込めるデータの件数が1,048,576件という制限があるため、集計することすらできませんのでAccessを利用するわけです。

事前に、自動的に生成したデータでAccessのキャパをテストした所、単純なデータなら2千万件くらいまでは取り込めることを確認して、実際の運用を開始したのですが、8ヶ月(だいたい1200万件くらい)で2Gバイトの壁にぶつかってしまいました。

壁

32ビット版のAccessの制約として一つのデータベースが2Gを超えることができないためなのです。実際には最適化することで2Gになるような場合は、読み込み中にエラーになります。

ランタイムを使っている場合は、重要な要素となります。

つまりは現実には読み込める実質的なデータ量としては、1.8Gくらいを上限と考えたほうが良さそうです。

そこで、取るべき方法をいくつか考えてみました。
① 64ビット版Accessを試してみること
② 毎月度の集計表をExcel上で加算処理すること

そして、第三の方法としてユニオンクエリを使用することです。
③ ユニオンクエリにより複数に分離したデータベースを結合する方法

②の方法は、即座に作成しましたが、クロス集計の加算処理は表側に持ってくる要素が状況によって変化しうるので、グランドトータルの加算のようには簡単にいきません。

そこで登場するのが③のユニオンクエリです。分離した同一構造のテーブルをユニオンクエリで結合することで32ビットAccessでも2Gを超えるデータを処理できる用になりました。

ユニオンクエリでデータベースを接続できるフィールド数には255列までという制約があります。2Gを超えそうなデータ処理をする場合は、ゆくゆくユニオンクエリで結合していくことを考えておく必要があります。

これで1000万件を超えていてもクロス集計が可能になりました。

最後に残ったのが①の方法です。

まず、64ビットにすると、ポインターのサイズが変わるとかで、ActiveXなどを利用している場合は「PtrSafe」属性が必要になります。

#If VBA7 And Win64 Then
Declare PtrSafe Function SHBrowseForFolder Lib "SHELL32" (lpbi As BROWSEINFO) As Long
Declare PtrSafe Function SHGetPathFromIDList Lib "SHELL32" (ByVal pIDL As Long, ByVal pszPath As String) As Long
#Else
Declare Function SHBrowseForFolder Lib "SHELL32" (lpbi As BROWSEINFO) As Long
Declare Function SHGetPathFromIDList Lib "SHELL32" (ByVal pIDL As Long, ByVal pszPath As String) As Long
#End If

で、ともかく動くようになったので、データを読み込みましたら、32ビットと同じ2Gの壁でエラー発生です。

エラー発生

その時のデータベースのサイズは、

エラー発生

32ビットと同じ2Gで認識ができなくなります。結局、64ビットであっても③の「ユニオンクエリ」で行方向へ結合するより方法がないようです。

ユニオンクエリ

この状態は11ヶ月分のデータを読み込んで最適化した状態です。データベースを半期ごとに分けていますが、1DBあたり2Gを超えなければ、正確に動いています。

クロス集計もデータ件数が1200万件有りますが、各属性ごとの総当りで集計してくれます。

ちなみにExcelの64ビット版ですが、これもネットなどでは2Gの制約がなくなると書かれていたので130万件のデータを読み込ませた所、1,048,576件でエラーが発生したのでマイクロソフトに電話して聞きました。

回答は、1シートのデータ件数が1,048,576件であることは変わりがないそうです。1ブックの最大サイズが2Gを超えたということなのだそうです。普通に考えると、ほとんどご利益がない話だと思います。

Office64ビットのまとめ

Excel64ビット
データ件数の制約は1,048,576件で32ビットと変わらず
(ブックのサイズが2Gを超えても平気とのこと)

Access64ビット
データベースのサイズ制限は2Gで変わらず
何が良くなったのかは不明

VBAを64ビットに対応させる必要がある
ActiveXなどを使用している場合は「PtrSafe」属性がないとエラーが起きる。

ただし、64ビットのメモリ空間が使用できるとのことで、おそらく速度改善がされているのかもしれません。

64乗

計算負荷が高いような場合はExcelに限っては期待できるかもしれませんが、まず、デメリットのほうが圧倒的だと思います。

総合的に考えると、Microsoft-Officeを64ビットにするメリットは、ほとんどないと言っても過言では無いというのがワードクラフトの結論です。

マイクロソフトにお願いができるなら、
Excelでさえ列数が16,364になったのだから、Access64ビットのテーブルの列数をExcelなみにして欲しいこと。

Access64ビットでは、データベースのサイズを32ビットの制約から解放して欲しいこと。

願わくば、MAC版のAccessがあれば通常のパソコン環境でのデータ共有ができること。

を切に願うものです。

蛇足ですが、Accessに関しては無料のサポートがないそうです。1回相談すると3万6千円ほどかかり、年間契約だと17万くらいかかるといっていました。

64ビットaccessも、結局試してみたのは、マイクロソフトに電話しても最大容量についての明快な回答が得られなかったからです。

キーワード