我有以下查询,我想删除管理部门的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';
这是在性能和所有情况下编写此查询的正确方式吗?我很困惑。
如有任何解释,不胜感激。
两个查询都有各自的优缺点
1(多个SELECT
我宁愿使用绑定变量重写查询。
Delete from Employee_tbl where emp_Id = :l_emp_id and emp_dep = :l_emp_dep;
并运行多次。
这样一来,oracle就不会每次都对查询进行硬解析,而且oracle重新使用解释计划,减少了共享全局区域(SGA(中的闩锁活动,最大限度地减少了CPU使用。
绑定变量的更多细节-应用程序性能的关键
但这里的一个小故障是,实际上,每次执行查询都需要从客户端切换到SQL引擎进程。(上下文切换,这也是一个代价高昂的过程(
为了覆盖这一点,我们使用bulk binding
。但并非所有客户都支持这一点。
2(使用IN或Temp表/CTE的单个查询
这个查询仅仅依赖于DB intelligence
本身。对于开发人员来说,这是一个没有头脑的问题。最近的优化器通过内部使用IN-list iterators
或临时表(如果需要(来巧妙地处理它们。
另一个优点是,只运行一次查询,操作只需要往返数据库一次。
让数据库决定负载。