I was reading a performance whitepaper about another embedded database engine and decided to write a program with similar parameters to get an idea of how quickly ESENT would run on my laptop.
First, the warnings
I ran the test under real-world conditions (i.e. the drive wasn’t formatted, other services were running), the set of operations isn’t very complex and the database was small so the database cache was large enough to hold the entire database. These numbers shouldn’t be directly compared to a different system and definitely don’t represent any particular real-world usage. If you are really curious I encourage you to write a test that represents your data usage and directly measure performance on your target machine.
I used 16MB logfiles with 8MB of log buffer and circular logging turned on. All the other system parameters were left at their defaults and the test program had a single thread. Each record had an 8 byte key and 32 bytes of data. My machine has 2 x 2.5 Ghz processors and a 7200RPM 320Gb SATA drive.
First the test inserted 1,000,000 records, one per transaction using JET_bitCommitLazyFlush so that committing a transaction didn’t force the log records to disk (they are written when the log buffer fills up):
elapsed time: 14.243 seconds : 70,210 insertions per sec
Then one record was retrieved 1,000,00 times:
elapsed time: 1.217 seconds : 821,693 retrieves per sec
All the records in the table were scanned by moving through the table with JetMove and retrieving each record:
elapsed time: 3.151 seconds : 317,360 moves per sec
Finally the records were retrieved in random order using JetMakeKey and JetSeek:
elapsed time: 19.984 seconds : 50,040 seeks per sec
These numbers are best used to give rough guidelines for performance in a situation were most of the database fits into the cache. As the size of your database increases the I/O performance of the underlying hardware will become the most important factor in performance.
(Test program is attached.)