我想确保我以正确的方式做每一件事。
我要分析一个 3Gb 的日志文件。为了在 ":memory:" 中执行所有查询以提高性能,我将每行日志的 10 个文本列替换为整数 id。
create table if not exists app (
id Integer primary key autoincrement,
value text unique
);
create table if not exists secret (
id integer primary key autoincrement,
value text unique
);
and 10 more tables
create table if not exists raw_log
(
id Integer primary key autoincrement,
app_id INTEGER,
secret_id INTEGER,
and 10 more _id columns
);
并创建一个查询视图和一个插入触发器。
create view if not exists log as
Select
raw_log.id,
app.value as app,
secret.value as secret,
and 10 more ...
from raw_log, app, secret, ..... x 10
where raw_log.app_id = app_id.id and raw_log.secret = secret.id and ... x 10
CREATE TRIGGER insert_log
INSTEAD OF INSERT ON log
FOR EACH ROW BEGIN
INSERT OR IGNORE INTO app(value) VALUES(NEW.app);
INSERT OR IGNORE INTO secret(value) values(NEW.secret);
... x 10
INSERT INTO raw_log(app_id,secret_id, .... x 10)
select app.id, secret.id, x 10
from app, secret, x 10
where app.value = NEW.app
and secret.value = NEW.secret
and ... x 10
END;
问题:
通过触发器插入看起来不起作用。日志表中的实体数量远少于应有的数量,而秘密和应用程序中的实体数量看起来正确。
我认为这是因为当一个新的应用程序和秘密出现在日志中时。它们可以毫无问题地插入表中。但是,由于这些更改尚未提交,因此以下查询无法成功引用这些值。
如果是这样,我该如何解决这些查询?
INSERT INTO raw_log(app_id,secret_id, .... x 10)
select app.id, secret.id, x 10
from app, secret, x 10
where app.value = NEW.app
and secret.value = NEW.secret
and ... x 10