Sql 提高子查询速度
此查询运行缓慢,并随着表的增长而变慢。有人能找到提高速度的方法吗 它旨在使用tblUser和tblLesson的id填充tblUser_课程,同时确保插入前表中不存在id 我在tblUser.name和tblLesson.name上有一个索引,但它似乎没有什么区别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
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上。回答得很好。我改进了查询语法并大幅降低了插入速度。谢谢