不同的查询还是一个?哪一个可行?

时间:2015-07-02 06:13:06

标签: oracle sqlperformance

我有以下查询,我想删除管理部门中的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 个答案:

答案 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或临时表(如果需要)巧妙地处理它们。

其他优点是,您运行一次查询,操作只需要往返数据库。

让数据库决定负载。