触发器很慢

时间:2014-10-12 10:27:51

标签: sqlite query-optimization database-performance

我正在研究一个支持SQLite的C ++应用程序,并使用基本的C API来访问SQLite数据库。我有两个表RIV_PATHS和RIV_INTERSECTIONS,其中RIV_PATHS包含一个主键,而Intersection包含多个外键,引用表RIV_PATHS(一个路径由多个交叉点组成)。每当删除路径时,都应删除所有交叉行。每当删除所有交叉点时,应删除路径:

CREATE TRIGGER PATHS_DELETE
AFTER DELETE ON RIV_PATHS
FOR EACH ROW
BEGIN
    DELETE FROM RIV_INTERSECTIONS WHERE pid = OLD.id;
END;

CREATE TRIGGER ISECTS_DELETE 
AFTER DELETE ON RIV_INTERSECTIONS
FOR EACH ROW
WHEN ((select count() from  RIV_INTERSECTIONS where pid = OLD.pid) = 0)
BEGIN
  DELETE FROM RIV_PATHS WHERE id = OLD.pid ;
END;

这很慢,我认为这是因为某些循环触发,但我不确定如何避免这种行为(如果可能的话)。我已经尝试将其中一个触发器改为之前但没有成功。

我对这些表的插入触发器也有同样的问题(未显示)。

数据库模式是这样的:我使用的两个RIV_ *表作为一些视图(但不是视图,因为我不能在SQLite中插入/更新它们)的其他一些表。我用SELECT * FROM创建它们。

CREATE TABLE RIV_INTERSECTIONS(
  PID INT,
  BOUNCE_NR INT,
  POS_X REAL,
  POS_Y REAL,
  POS_Z REAL,
  PRIMITIVE_ID INT,
  SHAPE_ID INT,
  OBJECT_ID INT,
  SPECTRUM_R REAL,
  SPECTRUM_G REAL,
  SPECTRUM_B REAL,
  INTERACTION_TYPE INT,
  LIGHT_ID INT
);
CREATE TABLE RIV_PATHS(
  ID INT,
  IMAGE_X INT,
  IMAGE_Y INT,
  LENS_U REAL,
  LENS_V REAL,
  TIMESTAMP REAL,
  THROUGHPUT_ONE REAL,
  THROUGHPUT_TWO REAL,
  THROUGHPUT_THREE REAL,
  RADIANCE_R REAL,
  RADIANCE_G REAL,
  RADIANCE_B REAL
);

1 个答案:

答案 0 :(得分:1)

在未索引列中查找值时,数据库必须扫描整个表。 确保id / pid列具有索引(或由于PRIMARY KEY或UNIQUE约束而具有隐式索引)。

在SQLite中,使用INSTEAD OF triggers时可以插入/更新视图。