提高子查询的速度

时间:2016-04-27 14:13:22

标签: sql insert derby

此查询运行缓慢,随着表的增长而变慢。有人能找到提高速度的方法吗?

打算使用tblUser和tblLesson的id填充tblUser_Lesson,同时确保在插入之前表中不存在id。

我有一个关于tblUser.name和tblLesson.name的索引,但它似乎没有什么区别。

INSERT INTO tblUser_Lesson (user, lesson)
  SELECT userId, lessonId
  FROM
  (
      SELECT tblUser.id userId, tblLesson.id lessonId
      FROM tblUser,
           tblLesson
      WHERE tblUser.name=?
        AND tblLesson.name=?
  ) tmp
  WHERE NOT EXISTS (SELECT user
                    FROM tblUser_Lesson tmp1
                    WHERE tmp1.user = tmp.userId
                      AND tmp1.lesson = tmp.tblLesson)

1 个答案:

答案 0 :(得分:6)

这是我觉得更容易阅读的查询的等效版本:

INSERT INTO tblUser_Lesson(user, lesson)
    SELECT userId, lessonId
    FROM tblUser u CROSS JOIN
         tblLesson l
    WHERE u.name = ? AND l.name = ? AND
          NOT EXISTS (SELECT 1
                      FROM tblUser_Lesson ul
                      WHERE ul.user = u.userId AND ul.lesson = l.tblLesson
                     );

我的第一个建议是让数据库完成工作。在tblUser_Lesson上创建唯一索引:

create unique index unq_tblUser_Lesson on tblUser_Lesson(UserId, Lesson);

然后只需插入:

INSERT INTO tblUser_Lesson(user, lesson)
    SELECT userId, lessonId
    FROM tblUser u CROSS JOIN
         tblLesson l
    WHERE u.name = ? AND l.name = ? ;

其次,我会为每个其他表创建索引:

create index idx_tbluser_name_id on tblUser(name, id);
create index idx_tblLesson_name_id on tblLesson(name, id);

加快了这个问题。

如果您(通常)不想在出现重复时出错,那么您可以保留NOT EXISTS条款。 tblUser_Lesson上的索引仍有帮助。