テスト内容
.NETのRelease Candidate版を使って書いたVB.NETのアプリケーションを用いて、いくつかのベンチマークテストを行います。各テストを5回ずつ実施し、それぞれ1件、10件、100件、1000件、10,000件のレコードを取得します。第1シリーズのテストでは、SQL Serverのデータソースに対してSQLClient Managed Providerを使用します。第2シリーズのテストでは、同じSQL Serverデータベースに対してOleDb Managed Providerを使用します。
このテストで使用したのは、1990年に米国の国勢調査結果で得られた姓のデータです。このテーブルには80,000件を超えるレコードがあり、各レコードには4つのフィールドがあります。このデータはSQL Server 2000データベースに納められています。
実行したベンチマークの種類は次のとおりです。
SQLClient Managed Provider | DataReader |
DataSet/DataTable | |
OleDb Managed Provider | DataReader |
DataSet/DataTable |
使用マシン
マザーボード | Soyo Dragon Plus |
メモリ | 512MB DDR RAM(クルーシャル) |
プロセッサ | AMD XP 1.5GHZ |
ハードディスク | Seagate 40GB 7200 |
テスト結果
SQLClient DataReaderによって1レコードを取得する場合は、0より大きな値が記録されることはほとんどありませんでした。データが100ナノ秒以内に返されたために、テストに記録されなかったのです。余談になりますが、ここで.NETのすばらしい新機能について触れておきましょう。現在では、ミリ秒(つまり1000分の1秒)単位での測定よりもずっと精度の高い、ティック数での測定を行うことができます。1ティックは100ナノ秒(1千万分の1秒)に相当します。ティックはSystem.DateTime
構造体のプロパティになっています。なお、今回のテスト結果は、わかりやすさを考慮して秒単位に変換してありますが、ティック数の加算を考慮して、この10進表記を10,000,000番目の列に入れています。
OleDb Managed ProviderのDataSetを使って10,000レコードを取得した場合が、すべてのテストのうちで最もパフォーマンスが悪く、911秒かかっています。
Records | SQL Client DataReader | SQL Client DataTable | OLEDB DataReader | OLEDB DataTable |
1 | 0.0000000 | 0.0801152 | 0.0000000 | 0.1001440 |
10 | 0.0000000 | 0.1001440 | 0.200288 | 0.9012960 |
20 | 0.0000000 | 0.1802592 | 0.100144 | 1.9027360 |
30 | 0.0100144 | 0.2804032 | 0.100144 | 2.8040320 |
40 | 0.0100144 | 0.3705328 | 0.100144 | 3.7053280 |
50 | 0.0100144 | 0.4706768 | 0.200288 | 4.7067680 |
60 | 0.0100144 | 0.5608064 | 0.200288 | 5.6080640 |
70 | 0.0200288 | 0.6509360 | 0.200288 | 6.5093600 |
80 | 0.0200288 | 0.7410656 | 0.200288 | 7.4106560 |
90 | 0.0200288 | 0.8412096 | 0.300432 | 8.3119520 |
100 | 0.0300432 | 0.9313392 | 0.300432 | 9.3133920 |
Records | SQL Client DataReader | SQL Client DataTable | OLEDB DataReader | OLEDB DataTable |
100 | 0.0400576 | 0.9313392 | 0.300432 | 9.6138240 |
200 | 0.0600864 | 1.7825630 | 0.600864 | 17.8256300 |
300 | 0.0801152 | 2.6638310 | 0.901296 | 26.7384500 |
400 | 0.1101584 | 3.5551120 | 1.101584 | 35.5511200 |
500 | 0.1402016 | 4.4463930 | 1.402016 | 44.4639400 |
600 | 0.1702448 | 5.3376750 | 1.802592 | 53.3767500 |
700 | 0.2002880 | 6.2289570 | 2.00288 | 62.6901400 |
800 | 0.2303312 | 7.1202380 | 2.303312 | 71.1022400 |
900 | 0.2703888 | 8.0015060 | 2.603744 | 80.0150500 |
1000 | 0.2904176 | 8.8927870 | 2.904176 | 88.9278700 |
Records | SQL Client DataReader | SQL Client DataTable | OLEDB DataReader | OLEDB DataTable |
1000 | 0.3004320 | 8.9628880 | 3.104464 | 90.5301700 |
2000 | 0.6108784 | 18.3463800 | 6.00864 | 178.1562000 |
3000 | 0.9313392 | 26.7785100 | 9.113104 | 267.3845000 |
4000 | 1.2317710 | 35.7013400 | 12.21757 | 356.5126000 |
5000 | 1.5221890 | 44.6542100 | 15.42218 | 446.0414000 |
6000 | 1.8827070 | 53.8073700 | 18.4265 | 553.4959000 |
7000 | 2.1931540 | 63.5113300 | 21.03024 | 636.4151000 |
8000 | 2.4334990 | 72.8046900 | 23.93442 | 726.8452000 |
9000 | 2.7639740 | 81.7876100 | 27.43946 | 832.7975000 |
10000 | 3.0844350 | 91.6217400 | 31.14478 | 911.7110000 |
この結果から、取得レコード数が10であっても10,000であっても、DataReader
に比べるとDataSet/DataTable
のパフォーマンスがかなり低いことがわかります。DataReader
の方が高速なことは、驚くにはあたりませんが、DataReader
によるデータアクセスが、DataSet
によるデータアクセスより27~56倍も高速なことには驚かされます。
もう1つ興味深いことは、SQLClient Managed Providerが、同じデータソースにアクセスするOleDb Managed Providerより平均10倍も高速なことです。こうしたパフォーマンスの低さは、どのようなOleDbソースでも同じだと結論づけてよさそうです。
開発者にとって大切なのは、パフォーマンスが最高であると同時に、信頼性が高く、スケーラブルなWebサイトを構築することです。DataReader
は、我々のニーズに最も合致した高パフォーマンスの方法です。そういうわけで、私と同じようなスピードマニアの方には、DataReader
をお勧めします。きっと満足していただけることでしょう。