For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
The optimization process and recommendations:
- Avoid Calling Functions With Indexed Columns (query line: 10): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `Co_Acc` is indexed, the index won’t be used as it’s wrapped with the function `Substr`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Avoid Calling Functions With Indexed Columns (query line: 11): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `Co_Acc` is indexed, the index won’t be used as it’s wrapped with the function `Substr`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Avoid Calling Functions With Indexed Columns (query line: 12): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `Co_Acc` is indexed, the index won’t be used as it’s wrapped with the function `Substr`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Avoid Calling Functions With Indexed Columns (query line: 13): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `Co_Acc` is indexed, the index won’t be used as it’s wrapped with the function `Substr`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Create Optimal Indexes (modified query below): The recommended indexes are an integral part of this optimization effort and should be created before testing the execution duration of the optimized query.
Optimal indexes for this query:
CREATE INDEX operation_history_idx_state_id_curr_day ON operation_history (state_id,curr_day);
The optimized query:
SELECT
t.co_filial AS fil_code,
t.emp_birth AS emp_code,
to_char(t.curr_day,
'YYYY-MM-DD') AS operation_date,
TRUNC(t.Sum_Pay / 100) AS summa
FROM
operation_history t
WHERE
Substr(t.Co_Acc, 8) LIKE '12294%'
AND Substr(t.Co_Acc, -3) > 599
AND Substr(t.Co_Acc, -3) != 683
AND Substr(t.Co_Acc, -3) < 696
AND t.state_id = 41
AND t.curr_day >= to_date('12.08.2019', 'DD.MM.YYYY')
AND t.curr_day < to_date('13.08.2019', 'DD.MM.YYYY')