SQLite3のベンチマークテストとバイナリ




SQLite3のベンチマークテスト


PythonでSQLite3のベンチマークテストを行ってみた。

usersテーブルを次のように作って実験した。

name type
id integer
name text



Initialize (Record Size の回数だけデータを insert する)

Request1 (Record に一行だけ insert する)

Request2 (Record から id=50 を select する)


Record Size File Size Initialize Request1 Request2
10^3 28K 0.012690 s 0.002479 0.000331 s
10^4 196K 0.085659 s 0.001758 s 0.000503 s
10^5 2.1M 0.906912 s 0.001722 s 0.000590 s
10^6 22M 8.376609 s 0.001798 s 0.000532 s
10^7 239M 86.897375 s 0.001175 s 0.000299 s

10万件を作成するのに8.3秒、100万件だと86秒かかっている。この感じだと1000万件は800秒以上になるだろうか。
レコード数が10倍になることで、10倍の時間がかかっているという比例関係になるようだ。ファイルサイズも大雑把に10倍ずつ増えていく計算になろうか。

面白いことに1行だけをselectしたり、insertする分には O^n のような指数関数的にはならないようだ。ハッシュで管理しているのだろうと推測できる。



SQLite3のバイナリ


ここで100件のレコードを登録したDBを od -c test_2.sqlite でキャプチャした結果を紹介しよう。
なにか面白いことが分かるかもしれない。

0000000    S   Q   L   i   t   e       f   o   r   m   a   t       3  \0
0000020  020  \0 001 001  \0   @          \0  \0  \0 002  \0  \0  \0 002
0000040   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0 001  \0  \0  \0 004
0000060   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0 001  \0  \0  \0  \0
0000100   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000120   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0 002
0000140   \0   .   0   :  \r  \0  \0  \0 001 017 277  \0 017 277  \0  \0
0000160   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0007660   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0   ?
0007700  001 006 027 027 027 001   _   t   a   b   l   e   u   s   e   r
0007720    s   u   s   e   r   s 002   C   R   E   A   T   E       T   A
0007740    B   L   E       u   s   e   r   s   (   i   d       i   n   t
0007760    e   g   e   r   ,       n   a   m   e       t   e   x   t   )
0010000   \r  \0  \0  \0   d  \n 370  \0 017 365 017 352 017 336 017 017
0010020  017 306 017 272 017 256 017 242 017 226 017 212 017   } 017   p
0010040  017   c 017   V 017   I 017   < 017   / 017   " 017 025 017  \b
0010060  016 373 016 356 016 341 016 324 016 307 016 272 016 255 016 240
0010100  016 223 016 206 016   y 016   l 016   _ 016   R 016   E 016   8
0010120  016   + 016 036 016 021 016 004  \r 367  \r 352  \r 335  \r 015
0010140   \r 303  \r 266  \r 251  \r 234  \r 217  \r 202  \r   u  \r   h
0010160   \r   [  \r   N  \r   A  \r   4  \r   '  \r 032  \r  \r  \r  \0
0010200   \f 363  \f 346  \f 331  \f 314  \f 277  \f 262  \f 245  \f 230
0010220   \f 213  \f   ~  \f   q  \f   d  \f   W  \f   J  \f   =  \f   0
0010240   \f   #  \f 026  \f  \t  \v 374  \v 357  \v 342  \v 325  \v 013
0010260   \v 273  \v 256  \v 241  \v 224  \v 207  \v   z  \v   m  \v   `
0010300   \v   S  \v   F  \v   9  \v   ,  \v 037  \v 022  \v 005  \n 370
0010320   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0015360   \0  \0  \0  \0  \0  \0  \0  \0  \v   d 003 001 033   c   h   o
0015400    g   e   _   9   9  \v   c 003 001 033   b   h   o   g   e   _
0015420    9   8  \v   b 003 001 033   a   h   o   g   e   _   9   7  \v
0015440    a 003 001 033   `   h   o   g   e   _   9   6  \v   ` 003 001
0015460  033   _   h   o   g   e   _   9   5  \v   _ 003 001 033   ^   h
0015500    o   g   e   _   9   4  \v   ^ 003 001 033   ]   h   o   g   e
0015520    _   9   3  \v   ] 003 001 033   \   h   o   g   e   _   9   2
0015540   \v   \ 003 001 033   [   h   o   g   e   _   9   1  \v   [ 003
0015560  001 033   Z   h   o   g   e   _   9   0  \v   Z 003 001 033   Y
0015600    h   o   g   e   _   8   9  \v   Y 003 001 033   X   h   o   g
0015620    e   _   8   8  \v   X 003 001 033   W   h   o   g   e   _   8
0015640    7  \v   W 003 001 033   V   h   o   g   e   _   8   6  \v   V
0015660  003 001 033   U   h   o   g   e   _   8   5  \v   U 003 001 033
0015700    T   h   o   g   e   _   8   4  \v   T 003 001 033   S   h   o
0015720    g   e   _   8   3  \v   S 003 001 033   R   h   o   g   e   _
0015740    8   2  \v   R 003 001 033   Q   h   o   g   e   _   8   1  \v
0015760    Q 003 001 033   P   h   o   g   e   _   8   0  \v   P 003 001
0016000  033   O   h   o   g   e   _   7   9  \v   O 003 001 033   N   h
0016020    o   g   e   _   7   8  \v   N 003 001 033   M   h   o   g   e
0016040    _   7   7  \v   M 003 001 033   L   h   o   g   e   _   7   6
0016060   \v   L 003 001 033   K   h   o   g   e   _   7   5  \v   K 003
0016100  001 033   J   h   o   g   e   _   7   4  \v   J 003 001 033   I
0016120    h   o   g   e   _   7   3  \v   I 003 001 033   H   h   o   g
0016140    e   _   7   2  \v   H 003 001 033   G   h   o   g   e   _   7
0016160    1  \v   G 003 001 033   F   h   o   g   e   _   7   0  \v   F
0016200  003 001 033   E   h   o   g   e   _   6   9  \v   E 003 001 033
0016220    D   h   o   g   e   _   6   8  \v   D 003 001 033   C   h   o
0016240    g   e   _   6   7  \v   C 003 001 033   B   h   o   g   e   _
0016260    6   6  \v   B 003 001 033   A   h   o   g   e   _   6   5  \v
0016300    A 003 001 033   @   h   o   g   e   _   6   4  \v   @ 003 001
0016320  033   ?   h   o   g   e   _   6   3  \v   ? 003 001 033   >   h
0016340    o   g   e   _   6   2  \v   > 003 001 033   =   h   o   g   e
0016360    _   6   1  \v   = 003 001 033   <   h   o   g   e   _   6   0
0016400   \v   < 003 001 033   ;   h   o   g   e   _   5   9  \v   ; 003
0016420  001 033   :   h   o   g   e   _   5   8  \v   : 003 001 033   9
0016440    h   o   g   e   _   5   7  \v   9 003 001 033   8   h   o   g
0016460    e   _   5   6  \v   8 003 001 033   7   h   o   g   e   _   5
0016500    5  \v   7 003 001 033   6   h   o   g   e   _   5   4  \v   6
0016520  003 001 033   5   h   o   g   e   _   5   3  \v   5 003 001 033
0016540    4   h   o   g   e   _   5   2  \v   4 003 001 033   3   h   o
0016560    g   e   _   5   1  \v   3 003 001 033   2   h   o   g   e   _
0016600    5   0  \v   2 003 001 033   1   h   o   g   e   _   4   9  \v
0016620    1 003 001 033   0   h   o   g   e   _   4   8  \v   0 003 001
0016640  033   /   h   o   g   e   _   4   7  \v   / 003 001 033   .   h
0016660    o   g   e   _   4   6  \v   . 003 001 033   -   h   o   g   e
0016700    _   4   5  \v   - 003 001 033   ,   h   o   g   e   _   4   4
0016720   \v   , 003 001 033   +   h   o   g   e   _   4   3  \v   + 003
0016740  001 033   *   h   o   g   e   _   4   2  \v   * 003 001 033   )
0016760    h   o   g   e   _   4   1  \v   ) 003 001 033   (   h   o   g
0017000    e   _   4   0  \v   ( 003 001 033   '   h   o   g   e   _   3
0017020    9  \v   ' 003 001 033   &   h   o   g   e   _   3   8  \v   &
0017040  003 001 033   %   h   o   g   e   _   3   7  \v   % 003 001 033
0017060    $   h   o   g   e   _   3   6  \v   $ 003 001 033   #   h   o
0017100    g   e   _   3   5  \v   # 003 001 033   "   h   o   g   e   _
0017120    3   4  \v   " 003 001 033   !   h   o   g   e   _   3   3  \v
0017140    ! 003 001 033       h   o   g   e   _   3   2  \v     003 001
0017160  033 037   h   o   g   e   _   3   1  \v 037 003 001 033 036   h
0017200    o   g   e   _   3   0  \v 036 003 001 033 035   h   o   g   e
0017220    _   2   9  \v 035 003 001 033 034   h   o   g   e   _   2   8
0017240   \v 034 003 001 033 033   h   o   g   e   _   2   7  \v 033 003
0017260  001 033 032   h   o   g   e   _   2   6  \v 032 003 001 033 031
0017300    h   o   g   e   _   2   5  \v 031 003 001 033 030   h   o   g
0017320    e   _   2   4  \v 030 003 001 033 027   h   o   g   e   _   2
0017340    3  \v 027 003 001 033 026   h   o   g   e   _   2   2  \v 026
0017360  003 001 033 025   h   o   g   e   _   2   1  \v 025 003 001 033
0017400  024   h   o   g   e   _   2   0  \v 024 003 001 033 023   h   o
0017420    g   e   _   1   9  \v 023 003 001 033 022   h   o   g   e   _
0017440    1   8  \v 022 003 001 033 021   h   o   g   e   _   1   7  \v
0017460  021 003 001 033 020   h   o   g   e   _   1   6  \v 020 003 001
0017500  033 017   h   o   g   e   _   1   5  \v 017 003 001 033 016   h
0017520    o   g   e   _   1   4  \v 016 003 001 033  \r   h   o   g   e
0017540    _   1   3  \v  \r 003 001 033  \f   h   o   g   e   _   1   2
0017560   \v  \f 003 001 033  \v   h   o   g   e   _   1   1  \v  \v 003
0017600  001 033  \n   h   o   g   e   _   1   0  \n  \n 003 001 031  \t
0017620    h   o   g   e   _   9  \n  \t 003 001 031  \b   h   o   g   e
0017640    _   8  \n  \b 003 001 031  \a   h   o   g   e   _   7  \n  \a
0017660  003 001 031 006   h   o   g   e   _   6  \n 006 003 001 031 005
0017700    h   o   g   e   _   5  \n 005 003 001 031 004   h   o   g   e
0017720    _   4  \n 004 003 001 031 003   h   o   g   e   _   3  \n 003
0017740  003 001 031 002   h   o   g   e   _   2  \t 002 003  \t 031   h
0017760    o   g   e   _   1  \t 001 003  \b 031   h   o   g   e   _   0
0020000