2

テーブル名の長さが、それらのテーブルの作成中のパフォーマンスに影響することに気付きました。問題を再現するコード例を次に示します。

#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) の最新の合併バージョンを使用しています。

4

2 に答える 2

4

テーブル名が長いと、空のデータベース ファイルは 4 倍大きくなります。これは、テーブル名が長いほど、スキーマ内のスペースが増えるためです。SQLite が 4 倍のコンテンツを書き込むのに 4 倍の時間がかかることは驚くべきことではありません。

テーブル名は一度だけ保存されることに注意してください。したがって、データベースにコンテンツを追加し始めると、両者の相対的なサイズの差は減少し、漸近的に 1.0 に近づきます。2 つのデータベース間のサイズの絶対的な違いは、一定のままである必要があります。

于 2013-09-04T14:27:59.000 に答える
2

テーブル名が長いほど、sqlite_masterシステム テーブルでより多くのスペースを占有します (ファイル サイズを比較してください)。SQLite がそのシステム テーブルを調べてテーブルを検索する (または新しいテーブル名が既に存在するかどうかを確認する) 場合、さらに多くのデータを読み取って比較する必要があります。

ただし、クエリを実行する場合、SQLite はスキーマが実際にアクセスされた最初のときにのみシステム テーブルからデータをロードするため、クエリのパフォーマンスはそれほど影響を受けません。

于 2013-09-04T07:46:11.727 に答える