sql - 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
提前明确检查是否存在?
解决方案
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
推荐阅读
- python - 当输出变量是连续的时,我们如何调整神经网络的超参数?
- javascript - 人们在 Javascript 中使用 Symbol 函数是为了什么?
- node.js - 只需从 Spotify API 中提取分析数据
- python - 由于值太大(Python)导致的 StandardScaler 错误。预处理时间序列数据
- apache-spark - 如何使用 pyspark 管理跨集群的数据帧的物理数据放置?
- jsonpath - 如何为路径列表选择 json 路径点符号?
- android - 使用 SharedPreferences.Editor 所做的更改是否会在设备重启后继续存在?
- r - 在 Shiny 中保存对不同数据表的更改
- python - 仅当列中的NaN少于给定数量时,如何用列替换NaN?
- tomcat - 从单个 webapps 文件夹将两个 war 文件部署到不同的端口