首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WHERE中的SQL IN。优化器有多聪明?

WHERE中的SQL IN。优化器有多聪明?
EN

Stack Overflow用户
提问于 2020-11-10 20:09:21
回答 1查看 31关注 0票数 1

我要执行以下查询:

代码语言:javascript
复制
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表永远不会改变,因此只执行一次检查。

这就是解释。看起来它会做很多事情。但我不确定该如何解释它。

代码语言:javascript
复制
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的存在?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-10 20:10:50

EXISTS通常比IN更有效。所以我把逻辑写成:

代码语言:javascript
复制
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应该是主键,这似乎很有可能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64768673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档