首页 > 解决方案 > SQL IN 在哪里。优化器有多聪明?

问题描述

我有以下查询要执行:

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)每个匹配行的值。那会很糟糕。另一方面,如果优化器很聪明,它会看到项目表永远不会改变,因此只检查一次。

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

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

我需要重写此更新吗?如果是这样,我将如何编写此 UPDATE 以project_id提前明确检查是否存在?

标签: sqlsqlitequery-optimization

解决方案


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


推荐阅读