据我所知,硬盘每旋转一圈可以有一次磁盘搜索,因此我很想知道将一行写入 SQLite 表需要多少磁盘搜索,包括锁定等。假设没有索引在桌子上(甚至不是主键)。我假设有一个磁盘试图将一行写入文件?如您所知,我想将性能与将相同数据写入平面文件进行比较。
我有一张PaymentInformation桌子
ID NAME Start End
1 Tina 1/7/2014 1/17/2014
2 Alice 3/7/2014 3/17/2014
3 John 5/7/2014 5/17/2014
4 Michelle 7/7/2014 7/17/2014
Run Code Online (Sandbox Code Playgroud)
我正在动态构建我的 SQL 查询,如下所示:
SQLiteDataBaseQueryHolder3 = "INSERT INTO " + SQLiteHelper.TABLE2_NAME + "(" +
"name, Start, End" +
")VALUES('" +
tempName + "'" +
",'" +start + "'" +
",'" + end + "" +
"')" +
" WHERE NOT EXISTS ( SELECT * FROM " +SQLiteHelper.TABLE2_NAME +" WHERE name = '"+
tempName+"' AND Start = '"+Start+"')"
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果(为了可读性而格式化): …
有一个像这样的表:
first_name last_name
------------------------
jack frost
john wayne
betty white
null jackson
Run Code Online (Sandbox Code Playgroud)
这个查询:
first_name last_name
------------------------
jack frost
john wayne
betty white
null jackson
Run Code Online (Sandbox Code Playgroud)
MySQL 和 Postgres 甚至不会运行它。他们以某种方式知道这需要 GROUP BY。
SQLite 生成单行结果:jack 3
MySQL 和 Postgres 如何知道这需要 GROUP BY?为什么还需要 GROUP BY?
为什么 SQLite 的结果是一行?我本来期望输出是这样的:
jack 3
john 3
betty 3
null 3
Run Code Online (Sandbox Code Playgroud) 来自 CREATE TABLE http://www.sqlite.org/lang_createtable.html 的SQLite 文档:
使用 CREATE TABLE AS 创建的表没有 PRIMARY KEY 并且没有任何类型的约束。
那么有没有什么通用的方法来创建带有主键和其他索引信息的表?
我有几个基本脚本,它们在填充我的 sqlite3 数据库时踢出一些信息,但大约有一半的时间命令立即失败:
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
1014->9000|1014|9000||-1.0|2
1014->9001|1014|9001||-1.0|2
...
Run Code Online (Sandbox Code Playgroud)
如果我添加.timeout 1;到命令的开头,我只会收到一个语法错误;如何.通过命令行以非交互方式向sqlite 传递特殊参数?
我正在做一个需要图书数据库的项目。问题如下:
一本书可以与多个人(作者、编辑、翻译者等)相关。那么一个人可能会以不同的角色为不同的书籍做出贡献。
Book1 PersonA (author), PersonB(editor)
Book2 PersonC (author), PersonB(translator), PersonD(editor)
Book3 PersonE (author), PersonA(editor)
Run Code Online (Sandbox Code Playgroud)
我有一张BOOKS桌子(bookID, bookTitle),一张PEOPLE桌子(personID, personName)和一张ROLES桌子(roleID, roleName)。然后我需要一种方法来关联这些表,然后查询它们。我想到了一个具有以下行结构的连接表:
bookId personID roleID
Run Code Online (Sandbox Code Playgroud)
这是处理这个问题的最佳方式吗(在所有这些表上插入、更新和删除条目时)?如果没有,有哪些替代方案?
注意:我使用的是 SQLite3。
PS:我希望我对术语的使用是正确的。
我有一个x这样定义的表:
CREATE TABLE x (
xid INTEGER NOT NULL PRIMARY KEY,
yid INTEGER NOT NULL REFERENCES y(yid),
is_principal BOOLEAN NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
该定义遗漏了一个必须满足的约束x。用英语来说,这个约束可以这样描述:
字段中可能有一行或多行具有给定值
yid,但其中必须始终有一行的is_principal字段为TRUE1。
我正在寻找一种方法来强制执行此约束。
(如果重要的话,我对适用于 SQLite3 和 PostgreSQL 的解决方案特别感兴趣。)
编辑:为了清楚起见,上面的描述并不排除 table 中存在y其值yid在 table 中根本没有提及的行x。对于 的此类值,yid根本没有任何价值xid,无论是本金价值还是其他价值。仅对于yid 表中出现的 x那些值,表中必须有且只有一行x具有is_principal = TRUE。
1表达相同约束的另一种方法是以下两个查询应始终产生相同的输出:
SELECT DISTINCT yid FROM x ORDER BY yid; …Run Code Online (Sandbox Code Playgroud) 我想将 15GB 文件逗号分隔的 gzip 压缩文件导入 Sqlite 3,而不必使用临时文件。
我想运行如下命令:
zcat input/surgical_code.csv.gz | tail -n +2 | sqlite3 db.sqlite ".import /dev/stdin surgical_code"
Run Code Online (Sandbox Code Playgroud)
这会解压缩文件,跳过标题并尝试导入。
问题是我无法在与 SQlite3 相同的引用命令上指定.mode cvs和.separator ","。
有任何想法吗?
使用$(echo -e 'line1\nline2')对我不起作用:
gzcat input/surgical_code.csv.gz | tail -n +2 | sqlite3 db.sqlite $(echo -e '.mode csv \n .separator \",\"\n.import /dev/stdin')
Run Code Online (Sandbox Code Playgroud)
Error: mode should be one of: ascii column csv html insert line list tabs tcl
我在做一些相当轻量级的数据按摩/清洁跑进其中使用相关子查询(可能是错误的)JOIN的一个版本跑了太大的问题很多比我相信这是正确的慢。我不问如何做查询(我相信现在我已经得到了正确的),但我想知道为什么慢版是如此缓慢。
问题
该域是一个相当简单的数据库,用于管理彩票辛迪加(记录会员付款、玩的游戏和获胜)。在转向新引擎 (SQLite) 时,我正在尝试清理数据并改进表的结构。
现有_Winnings表格记录了赢得的金额和日期以及“游戏类型”(可以玩多个游戏):
CREATE TABLE [_Winnings](
[ID] integer primary key not null,
[WinDate] date,
[Amount] integer,
[GameType] integer references _Games(ID)
);
CREATE INDEX [_WinningsIndex] on _Winnings(GameType) ;
Run Code Online (Sandbox Code Playgroud)
主要问题是没有链接(除了获胜日期)到实际玩的游戏。这些记录已经被迁移,现在保存在一个EventHistory表中:
CREATE TABLE [EventHistory](
[ID] integer primary key not null,
[EventType] integer references Events(ID),
[GameType] integer references Games(ID),
[EventDate] date
);
CREATE INDEX [EventHistoryEventIndex] on EventHistory(EventType) ;
CREATE INDEX [EventHistoryGameIndex] on EventHistory(GameType) ;
CREATE INDEX [EventHistoryDateIndex] on EventHistory(EventDate) ;
Run Code Online (Sandbox Code Playgroud)
三个表_Games, …
我在我们的代码库中找到了这个查询:
DELETE FROM "Foo"
WHERE ("Foo"."Id", "Foo"."CreatedAt")
IN (SELECT "f"."Id", "f"."CreatedAt"
FROM "Foo" AS "f"
WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
它删除当前时间之前创建的记录。
这给出了相同的结果:
DELETE FROM "Foo"
WHERE "Foo"."CreatedAt"
IN (SELECT "f"."CreatedAt"
FROM "Foo" AS "f"
WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么Foo.Id将 包含在WHERE子句中 - 也许是各种重构留下的垃圾(例如,它可能已用于批量删除ORDER BY "f"."Id" LIMIT 1000)。但因为这是一场PK,我不愿意删除它,因为也许它的存在是有原因的。
是否有理论/性能原因将其放在那里,或者这两个查询是否等效?
(这同时针对 postgres 和 sqlite。)
sqlite ×10
csv ×2
postgresql ×2
subquery ×2
aggregate ×1
constraint ×1
duplication ×1
import ×1
insert ×1
performance ×1
query ×1