我有以下查询,我想删除管理部门中的3名员工。
Delete from Employee_tbl where emp_Id = 123 and emp_dep = 'Admin';
Delete from Employee_tbl where emp_Id = 456 and emp_dep = 'Admin';
Delete from Employee_tbl where emp_Id = 789 and emp_dep = 'Admin';
我正在考虑为此编写一个查询 -
Delete from Employee_tbl where emp_Id in (123, 456, 789) and emp_dep = 'Admin';
这是在性能和所有情况下编写此查询的正确方法吗?我很迷惑。
任何解释都将不胜感激。
答案 0 :(得分:1)
两种查询都有其优缺点
1)多个SELECT。
我宁愿使用绑定变量重写查询。
Delete from Employee_tbl where emp_Id = :l_emp_id and emp_dep = :l_emp_dep;
多次运行。
这样,oracle每次都不会硬解析查询,并且Oracle重新使用解释计划来减少共享全局区域(SGA)中的锁存活动,从而最大限度地减少CPU使用。
来自Bind variables - The key to application performance
的更多详情但是这里有一个小故障,实际上每次执行查询都需要从客户端切换到SQL引擎进程。(上下文切换,这也是一个代价高昂的过程)
要覆盖此内容,我们使用bulk binding
。但并非所有客户都支持这一点。
2)使用IN或Temp表/ CTE进行单一查询。
此查询仅取决于DB intelligence
本身。这对开发人员来说并不聪明。最近的优化器,在内部使用IN-list iterators
或临时表(如果需要)巧妙地处理它们。
其他优点是,您运行一次查询,操作只需要往返数据库。
让数据库决定负载。