テーブル名の長さが、それらのテーブルの作成中のパフォーマンスに影響することに気付きました。問題を再現するコード例を次に示します。
#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"
int main() {
int i, sr;
char table_query[1000];
sqlite3* db;
sr = sqlite3_open("test.db", &db);
assert(sr == SQLITE_OK);
sr = sqlite3_exec(db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
assert(sr == SQLITE_OK);
sr = sqlite3_exec(db, "PRAGMA journal_mode=OFF", NULL, NULL, NULL);
assert(sr == SQLITE_OK);
sr = sqlite3_exec(db, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL);
assert(sr == SQLITE_OK);
sr = sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION;", NULL, NULL, NULL);
assert(sr == SQLITE_OK);
for (i = 0; i < 10000; ++i) {
#ifdef LONG_NAMES
sprintf(table_query, "CREATE TABLE `TABLE_%d_AKLKEKABCDEFGHIJK4C6F766520416C6C20546865205061696E204177617920496E636C204B796175202620416C626572742052656D69782020434452` (content);", i);
#else
sprintf(table_query, "CREATE TABLE `TABLE_%d` (content);", i);
#endif
sr = sqlite3_exec(db, table_query, NULL, NULL, NULL);
assert(sr == SQLITE_OK);
}
sr = sqlite3_exec(db, "END TRANSACTION;", NULL, NULL, NULL);
assert(sr == SQLITE_OK);
sr = sqlite3_close(db);
assert(sr == SQLITE_OK);
return 0;
}
コンパイルする:
gcc main.c sqlite3.c -O3 -DLONG_NAMES -DNDEBUG
gcc main.c sqlite3.c -O3 -DNDEBUG
私のマシンでは、 のような比較的短いテーブル名を使用TABLE_{table #}
すると、10,000 個のテーブルを持つデータベースの作成に約 14 秒かかります。これらのテーブル名は、7 文字から最大 11 文字までさまざまです。
のような比較的長いテーブル名を使用する場合TABLE_{table #}_{some unique identifying name that adds 120 or so characters}
、10,000 個のテーブルを含むデータベースの作成には約 60 秒かかります。
長いテーブル名でデータベースを作成すると、4 倍以上の時間がかかりました!
これはなぜですか?これは予想される動作ですか、それともバグですか?
また、長い名前のテーブルを作成するとパフォーマンスが低下するため、このようなデータベースでのクエリのパフォーマンスも低下するのではないかと考えています。このSOの答えは、MySQLに関しては答えが「いいえ」であると信じているようですが、参照はありません。
考え?
PS: sqlite (3.8) の最新の合併バージョンを使用しています。