关于in改为exist的优化

本文探讨了在数据库测试中,使用IN语法可能导致的性能问题,并提供了将IN语句转换为EXIST或NOT EXISTS语句以优化查询效率的方法。通过实例展示了如何重构SQL查询,以提高执行速度。
在测试中发现,在GP中,部分使用IN语法的sql,执行起来比较慢。要是发现有类似情况,可以优化一下,改为exist 或者not exist语法
例如
insert into my_db.my_table1
 sel
 t2.field1
,t2.field2
,t2.field3
,t2.field4
,t2.field5
,t3.field6
,2
,t3.field7
 from
 my_db.table2 t2
 inner  join
 my_db.table3  t3
 on t2.field4=t3.field4
 and t2.field8=t3.field9
 and t2.field10=t3.field11
 and t2.field12=t3.field13
 and t2.field14=t3.Tkg_field14
 and t3.field6>=0
 and t3.field15=1
 and t3.field16=1
 where  
( t2.field1,t2.field2,t2.field3 ) not in (sel field1 ,field2  ,field3  from  my_db.my_table1 )
and 
t3.field4 not in (sel field4 from my_db.my_table1 group by 1)        ;
 
 
修改为:
 
insert into my_db.my_table1
 select
 t2.field1
,t2.field2
,t2.field3
,t2.field4
,t2.field5
,t3.field6
,2
,t3.field7
 from
 my_db.table2 t2
 inner  join
 my_db.table3  t3
 on t2.field4=t3.field4
 and t2.field8=t3.field9
 and t2.field10=t3.field11
 and t2.field12=t3.field13
 and t2.field14=t3.Tkg_field14
 and t3.field6>=0
 and t3.field15=1
 and t3.field16=1
 where  not exists (select * from my_db.my_table1 aaaa where aaaa.field1=t2.field1 and aaaa.field2=t2.field2  and aaaa.field3=t2.field3  )
and not exists (select * from my_db.my_table1 aaaa where aaaa.field4=t2.field4   )
      ;
 
在 Windows 批处理中,`if exist *.html del *.html` 这条命令看似简单,但存在一些潜在问题,可能无法正确删除所有 `.html` 文件。 ### 使用 `if exist *.html del *.html` 的问题 1. **通配符匹配限制**:`if exist *.html` 只能检测当前目录下是否存在 `.html` 文件,而不能递归检测子目录中的文件。这意味着该命令仅作用于当前目录下的 `.html` 文件,无法覆盖深层路径中的目标文件[^1]。 2. **多个文件时的删除行为**:当使用 `del *.html` 删除多个文件时,如果未加上 `/q` 参数(即安静模式),系统会提示用户确认每个删除操作。这不仅影响效率,还可能导致误操作中断流程。 3. **路径包含空格或特殊字符时的兼容性问题**:若文件名中包含空格或特殊字符,直接使用 `del *.html` 可能导致命令解析错误,从而跳过某些文件或引发异常。 ### 推荐做法:结合 `for /r` 实现递归删除 为确保批处理脚本能准确删除当前目录及其子目录下的所有 `.html` 文件,建议使用 `for /r` 命令进行递归遍历,并配合 `del` 指令强制删除文件。以下是优化后的脚本示例: ```batch @echo off setlocal enabledelayedexpansion :: 检查是否存在 .html 文件并递归删除 for /r %%f in (*.html) do ( if exist "%%f" ( del /q /f "%%f" echo 已删除文件:%%f ) ) ``` - `for /r %%f in (*.html)`:递归查找当前目录及子目录下的所有 `.html` 文件。 - `del /q /f "%%f"`:使用 `/q` 静默删除,避免提示;使用 `/f` 强制删除只读文件。 - `if exist "%%f"`:确保文件真实存在后再执行删除操作,防止因并发修改导致的异常。 ### 总结 虽然 `if exist *.html del *.html` 在某些简单场景下可以工作,但它并不适用于需要递归删除、批量处理或高可靠性的任务。推荐采用 `for /r` 结合 `del` 的方式,以实现更全面和稳定的文件清理效果。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值