【问题标题】:SQL IN in WHERE. How smart is the optimizer?SQL IN 在哪里。优化器有多聪明?
【发布时间】:2021-02-22 09:04:00
【问题描述】:

我有以下查询要执行:

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 的存在?

【问题讨论】:

    标签: sql sqlite query-optimization


    【解决方案1】:

    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 应该是主键,这似乎很有可能。

    【讨论】:

    • 你说得对,project_id 是主键。事实上,EXIST 版本的 EXPLAIN 现在显示它使用它。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多