SQL Tuning Case Study 9 - Use - Concat
SQL Tuning Case Study 9 - Use - Concat
-----------------------------------------------------------------------------------
----------------------------
FIRST_NAME LAST_NAME
-------------------- -------------------------
Neena Kochhar
Jennifer Whalen
-----------------------------------------------------------------------------------
---------------------
| Id | Operation | Name | Rows | Bytes |
Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
---------------------
| 0 | SELECT STATEMENT | | 2 | 58 |
3 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 2 | 58 |
3 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 2 | 58 |
3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID | EMPLOYEES | 2 | 44 |
2 (0)| 00:00:01 |
| 4 | BITMAP CONVERSION TO ROWIDS | | | |
| |
| 5 | BITMAP OR | | | |
| |
| 6 | BITMAP CONVERSION FROM ROWIDS| | | |
| |
|* 7 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | | |
1 (0)| 00:00:01 |
| 8 | BITMAP CONVERSION FROM ROWIDS| | | |
| |
|* 9 | INDEX RANGE SCAN | EMP_EMP_ID_PK | | |
1 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | DEPT_ID_PK | 1 | |
1 (0)| 00:00:01 |
|* 11 | TABLE ACCESS BY INDEX ROWID | DEPARTMENTS | 1 | 7 |
1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------
---------------------
7 - access("E"."DEPARTMENT_ID"=10)
9 - access("E"."EMPLOYEE_ID"=101)
10 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
11 - filter("D"."LOCATION_ID"=1700)
TABLE STATISTICS for EMPLOYEES
DEPT_LOCATION_IX 7 27 NONUNIQUE
-->LOCATION_ID
Resolution:
The use_concat hint requests that a union all execution plan be used for all OR
conditions in the query, rewriting the query into multiple queries. The use_concat
hint is commonly invoked when a SQL query has OR conditions in the where clause.
UNION ALL
SELECT E.FIRST_NAME,E.LAST_NAME
FROM EMPLOYEES E,DEPARTMENTS D
WHERE E.DEPARTMENT_ID = 10
AND E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND D.LOCATION_ID = 1700;
Execution Plan
----------------------------------------------------------
Plan hash value: 3210906806
-----------------------------------------------------------------------------------
-----------------
| Id | Operation | Name | Rows | Bytes | Cost
(%CPU)| Time |
-----------------------------------------------------------------------------------
-----------------
| 0 | SELECT STATEMENT | | 2 | 58 | 4
(0)| 00:00:01 |
| 1 | CONCATENATION | | | |
| |
| 2 | NESTED LOOPS | | 1 | 29 | 2
(0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID | EMPLOYEES | 1 | 22 | 1
(0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | EMP_EMP_ID_PK | 1 | | 1
(0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID | DEPARTMENTS | 1 | 7 | 1
(0)| 00:00:01 |
|* 6 | INDEX UNIQUE SCAN | DEPT_ID_PK | 1 | | 1
(0)| 00:00:01 |
| 7 | NESTED LOOPS | | 1 | 29 | 2
(0)| 00:00:01 |
| 8 | NESTED LOOPS | | 1 | 29 | 2
(0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 22 | 1
(0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 1 | | 1
(0)| 00:00:01 |
|* 11 | INDEX UNIQUE SCAN | DEPT_ID_PK | 1 | | 1
(0)| 00:00:01 |
|* 12 | TABLE ACCESS BY INDEX ROWID | DEPARTMENTS | 1 | 7 | 1
(0)| 00:00:01 |
-----------------------------------------------------------------------------------
-----------------
4 - access("E"."EMPLOYEE_ID"=101)
5 - filter("D"."LOCATION_ID"=1700)
6 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
9 - filter(LNNVL("E"."EMPLOYEE_ID"=101))
10 - access("E"."DEPARTMENT_ID"=10)
11 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
12 - filter("D"."LOCATION_ID"=1700)
COUNT(*)
----------
1
COUNT(*)
----------
1