Sql 提高子查询速度

Sql 提高子查询速度,sql,insert,derby,Sql,Insert,Derby,此查询运行缓慢,并随着表的增长而变慢。有人能找到提高速度的方法吗 它旨在使用tblUser和tblLesson的id填充tblUser_课程,同时确保插入前表中不存在id 我在tblUser.name和tblLesson.name上有一个索引,但它似乎没有什么区别 INSERT INTO tblUser_Lesson (user, lesson) SELECT userId, lessonId FROM ( SELECT tblUser.id userId, tblLes

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

它旨在使用tblUser和tblLesson的id填充tblUser_课程,同时确保插入前表中不存在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)

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

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\u课程
上创建唯一索引:

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\u课程
上的索引仍有帮助。

无连接条件?非常出乎意料。简单的联接会使它加速几英里…您使用这个
插入
究竟想实现什么?您正在从两个表(tbluser,tbllesson)中进行选择,没有条件将两个表关联起来,因此子查询正在进行笛卡尔联接,并且您从该查询中获得n x m条记录。@JamieD77注意参数。相反,它将所有名为“sql”的课程分配给每个名为“serg”的用户。很好的解释,我喜欢它。你把它钉在了@Gordon上。回答得很好。我改进了查询语法并大幅降低了插入速度。谢谢