SQLServerとAccessの速度比較

SQL ServerとAccessの速度比較をする前に実験環境を紹介。

<サーバー側>
Dell Precision M4800
Win7Pro 64bit Core i5-4200M 16GB
SSD500GB
WiFi接続 802.11ac
SQL Server 2008R2 Express Edition

<クライアント側>
MacBook Pro Retina, Mid 2012
VMware Fusion
Win7Pro 32bit (Core i7 2コアを割り当て)(2GBを割り当て)
SSD(50GBを割り当て)
有線LAN接続 1000BASE-T

<ネットワーク>
ローカルネットワーク上に1000BASE-TのHUBと、WZR-1750DHP2(11ac)でWiFi接続

<その他>
テストデータは、139万レコードのデータを使用、同じLike文による抽出条件。
サーバー側はSQLServerのTCPを有効にしてローカル内のクライアントと接続出来る状態にする。更にフォルダー共有にてAccessファイルをクライアントと接続出来る状態にする。
.NETアプリからSQL発行をしてDataGridViewに表示するまでの経過時間を評価。

大まかな条件等は上記の通りです。


 

■SQL Server
それでは、SQLServerのテストを行います。
データベースは、139万レコードで約550MB規模のデータになります。

2015110801
実行結果は下図の通り、139万レコードから1万2千レコードのデータを抽出するのに約1秒でした。マジ高速です!

2015110804

実行中、クライアント側でトラフィックモニタもしてました。
数十KBの送信データと、抽出結果のデータのみがネットワーク上に流れてるのが分ります。

2015110803

 


 

■Access
次はAccessで同様の検索で試します。
データベースは、SQLServerからAccessにエクスポートして、更にAccess2007形式に変換します。(MDB→accdb)
インデックスも振り直してます。この時点で、ファイル容量は875MBあります。
※ファイル容量はMDBからaccdb変換しても殆ど同じでした。
2015110802

これを同じ.NETアプリで同じ検索を行うと、約2分以上掛かりました。
遅すぎて使い物になりませんね…

2015110806

トラフィックモニターでは、検索中に大量の受信データが流れているのが観測出来ます。
SQLServerでは、サーバー内でクエリ処理して結果を返すのに対し、Accessではクライアント側でクエリ処理するので、ネットワーク上にデータが流れます。
小さいテーブルでは殆ど気になりませんが、大きくなるに従いトラフィック量も増えていきます。これはクエリを実行している端末だけでなく、ローカルネットワーク上に繋がってる他端末のトラフィックにも影響することもあります。

2015110805

 


■最後に
今回のテストでは、SQLServerが圧倒的に高速だと分かりました。しかし、AccessでもCOUNT関数などの集計クエリでは瞬時に結果を得られます。(殆どのケースでSQLServerが高速ですけどね)
無償版のExpress Editionでも高いパフォーマンスを発揮してくれるのは、ITに投資し難い企業にはオススメしたいデータベースだと思います。

余談ですが、弊社でも1年半ほど前からAccess主体の社内システムから徐々にSQLServer Express Editionに切り替えています。サーバーは通常のスモールタイプのデスクトップPCにWindowsVista Business 32bit/RAM 4GB/2.5inch HDDと非常に頼りない構成です。ログイン登録している端末は約60台ですが、今に至るまで停電によるシステム停止以外は一度もトラブル無し。Express Editionは小規模向けと謳われてますが、どの程度までが小規模なのかが分かりませんが、この程度は小規模の範囲なのですかね?

なお、同じ事をAccessで構築すると、OSレベルでアクセス数上限を超えます…