gpt4 book ai didi

c - sqlite 中的表名长度会影响性能。为什么?

转载 作者:行者123 更新时间:2023-12-03 17:38:32 25 4
gpt4 key购买 nike

我注意到表名的长度会影响创建这些表时的性能。以下是重现该问题的代码示例:

#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 answer似乎认为关于 MySQL 的答案是否定的,但没有给出引用。

想法?

P.S.: 我使用的是最新的合并版 sqlite (3.8)

最佳答案

对于较长的表名,生成的空数据库文件会大 4 倍,因为较长的表名会在架构中占用更多空间。 SQLite 编写 4 倍的内容需要 4 倍的时间也就不足为奇了。

请注意,表名只存储一次。因此,一旦开始向数据库添加内容,两者之间的相对大小差异就会减小,逐渐接近 1.0。两个数据库之间的绝对大小差异应保持不变。

关于c - sqlite 中的表名长度会影响性能。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18603123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com