我要执行以下查询:
UPDATE scenario_group
SET
project_id = @projectId
WHERE
scenario_group_id = @scenarioGroupId
AND @projectId IN (SELECT project_id FROM project);";对我来说,这看起来像是要计算每个匹配行的@projectId IN (SELECT project_id FROM PROJECT)。那会很糟糕。另一方面,如果优化器很聪明,它将看到projects表永远不会改变,因此只执行一次检查。
这就是解释。看起来它会做很多事情。但我不确定该如何解释它。
id parent notused detail
3 0 0 SEARCH TABLE scenario_group USING INTEGER PRIMARY KEY (rowid=?)
8 0 0 USING ROWID SEARCH ON TABLE project FOR IN-OPERATOR我需要重写这个更新吗?如果是这样,我该如何编写此更新以提前显式检查project_id的存在?
发布于 2020-11-10 20:10:50
EXISTS通常比IN更有效。所以我把逻辑写成:
UPDATE scenario_group
SET project_id = @projectId
WHERE scenario_group_id = @scenarioGroupId AND
EXISTS (SELECT 1 FROM project p WHERE p.project_id = @projectId);特别地,这将利用project(project_id)上的索引--考虑到project_id应该是主键,这似乎很有可能。
https://stackoverflow.com/questions/64768673
复制相似问题