2017-10-11 82 views
1

我有一个相对较大的SQLite数据库(〜900 MB),里面有3个表。我最近通过软件SQLlitebrowser从主表中删除了一个字段。我这里使用的找到了答案:Delete column from SQLite table在ALTER后SQLite数据库写入缓慢

所以我基本上跑了这一点:

BEGIN TRANSACTION; CREATE TEMPORARY TABLE t1_backup(id, percentage_match, doi, title, date, journal, authors, abstract, graphical_abstract, liked, url, new, topic_simple, author_simple); INSERT INTO t1_backup SELECT id, percentage_match, doi, title, date, journal, authors, abstract, graphical_abstract, liked, url, new, topic_simple, author_simple FROM papers; DROP TABLE papers; CREATE TABLE papers(id, percentage_match, doi, title, date, journal, authors, abstract, graphical_abstract, liked, url, new, topic_simple, author_simple); INSERT INTO papers SELECT id, percentage_match, doi, title, date, journal, authors, abstract, graphical_abstract, liked, url, new, topic_simple, author_simple FROM t1_backup; DROP TABLE t1_backup; COMMIT;

我也试图通过一个python脚本来运行该查询。

数据库更改后,写入主表非常缓慢。 当我尝试在原始数据库上写入数据时(我在删除该字段之前进行了备份),我可以以更快或更快的速度写入主表。

你知道为什么会发生这种情况吗?我试图抽取新更改的数据库,但性能损失仍在此处。

编辑:

@neuhaus:我跑的新表.schema(我第一次听到它,原谅我,如果我滥用的话):

sqlite> .schema papers CREATE TABLE papers(id, percentage_match, doi, title, date, journal, authors, abstract, graphical_abstract, liked, url, new, topic_simple, author_simple);

而且在老表:

sqlite> .schema papers CREATE TABLE IF NOT EXISTS "papers" ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `percentage_match` REAL, `doi` TEXT, `title` TEXT, `date` TEXT, `journal` TEXT, `authors` TEXT, `abstract` TEXT, `graphical_abstract` TEXT, `liked` INTEGER, `url` TEXT, `new` INTEGER, `topic_simple` TEXT, `author_simple` TEXT , url_image TEXT);

很明显是有区别的。看起来这些字段的类型不在新表中。你觉得怎么样,我该如何纠正? ?

回答

0

使用sqlite3实用程序和它的.schema命令比较旧表格和新表格的模式。

新表很可能缺少索引。

使用.schema命令的输出(不包含要删除的列)给出的CREATE TABLE语句而不是您现在使用的命令。

+0

我编辑了我的问题以添加'''schema'''的结果 – Rififi

+0

我编辑了我的答案。只需更改create table语句并添加主键即可。您可能还想添加旧表格中的AUTOINCREMENT。 – neuhaus

+0

我是否也应该为其他字段添加类型? – Rififi