Overall impression
We run two sets of tests:
- "Regular" test, with an index only over the objects IDs;
- "Unique field" test, with an index over object IDs and a "Name" UTF-8 property.
The performance scaling, when it comes to mORMot internal process
(serialization, ORM, REST, in-memory tables) and SQLite3 engine, is
linear.
Existing bottlenecks (like SQLite3 hard-drive on disk synchronization)
persists, which does make sense.
Oracle performance is similar for individual requests, since the most
process is spent in the remote access over a network; but array DML
insertion is still very efficient, and CPU % use is very low.
TObjectList / TSQLRestServerStaticInMemoryExternal
process
speed is amazing - and the new CPU seems to like it!
ODBC
process is still slower than direct access to Oracle client, and could be
enhanced - especially by implementing array binding of parameters for BATCH
process.
But no regression has been observed, just some small fixes discovered and
committed.
Regular test
First of all, the "regular test", with UNIK conditional not defined.
It is similar to those previous
tests.
Insertion speed
SQLite3 (file full) |
SQLite3 (file off) |
SQLite3 (mem) |
TObjectList (static) |
TObjectList (virtual) |
SQLite3 (ext file full) |
SQLite3 (ext file off) |
SQLite3 (ext mem) |
Oracle | ODBC Oracle | Jet | |
Direct | 119 | 994 | 91397 | 277454 | 290731 | 186 | 1038 | 81952 | 335 | 192 | 1635 |
Batch | 167 | 915 | 112450 | 410643 | 421834 | 180 | 936 | 103382 | 51538 | 207 | 1796 |
Trans | 75417 | 103248 | 107644 | 284592 | 290663 | 62188 | 93711 | 97540 | 514 | 267 | 2052 |
Batch Trans | 105095 | 126138 | 132587 | 410576 | 416354 | 98900 | 110631 | 120505 | 54336 | 257 | 2177 |
Read speed
SQLite3 (file full) |
SQLite3 (file off) |
SQLite3 (mem) |
TObjectList (static) |
TObjectList (virtual) |
SQLite3 (ext file full) |
SQLite3 (ext file off) |
SQLite3 (ext mem) |
Oracle | ODBC Oracle | Jet | |
By one | 28084 | 27700 | 128614 | 289855 | 296278 | 136010 | 136870 | 138404 | 634 | 450 | 2580 |
All Virtual | 440489 | 424448 | 429848 | 668091 | 309904 | 249650 | 256660 | 247328 | 56932 | 22850 | 141723 |
All Direct | 439367 | 429774 | 413257 | 670960 | 655909 | 426912 | 431034 | 431518 | 90573 | 39885 | 196078 |
Test with unique field
Then, we defined UNIK conditional, to compare with this other benchmark result.
Insertion speed
SQLite3 (file full) |
SQLite3 (file off) |
SQLite3 (mem) |
TObjectList (static) |
TObjectList (virtual) |
SQLite3 (ext file full) |
SQLite3 (ext file off) |
SQLite3 (ext mem) |
Oracle | ODBC Oracle | Jet | |
Direct | 149 | 814 | 59591 | 247451 | 249103 | 144 | 808 | 56143 | 347 | 192 | 1580 |
Batch | 155 | 751 | 67837 | 338730 | 354333 | 139 | 813 | 65983 | 31636 | 185 | 1606 |
Trans | 50356 | 66472 | 70737 | 244558 | 251686 | 49933 | 63606 | 65547 | 493 | 255 | 2103 |
Batch Trans | 68201 | 78473 | 81944 | 341950 | 349797 | 66490 | 72578 | 75804 | 14454 | 248 | 2131 |
Read speed
SQLite3 (file full) |
SQLite3 (file off) |
SQLite3 (mem) |
TObjectList (static) |
TObjectList (virtual) |
SQLite3 (ext file full) |
SQLite3 (ext file off) |
SQLite3 (ext mem) |
Oracle | ODBC Oracle | Jet | |
By one | 27998 | 28272 | 129038 | 285975 | 291205 | 136388 | 137805 | 138450 | 602 | 437 | 2495 |
By name | 26019 | 25566 | 100597 | 176112 | 172401 | 84224 | 83633 | 83764 | 635 | 439 | 2402 |
All Virtual | 434103 | 421834 | 436033 | 672314 | 306842 | 253459 | 253369 | 255193 | 56282 | 23459 | 138542 |
All Direct | 436414 | 425025 | 434253 | 654278 | 658674 | 435085 | 431928 | 433914 | 77759 | 37993 | 194855 |
Feedback is welcome on our forum!