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: 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 `sampletime` is indexed, the index won’t be used as it’s wrapped with the function `trunc`. 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: 14): 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 `sampletime` is indexed, the index won’t be used as it’s wrapped with the function `trunc`. 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: 15): 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 `sampletime` is indexed, the index won’t be used as it’s wrapped with the function `trunc`. 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 scalarsample_idx_sensorid ON scalarsample (sensorid);
The optimized query:
SELECT
scalarsample.sensorid,
trunc(scalarsample.sampletime,
'hh24') + (trunc(to_char(scalarsample.sampletime,
'mi'))) / 24 / 60 + (trunc(to_char(scalarsample.sampletime,
'ss') / 15) * 15) / 24 / 60 / 60 AS tspan,
avg(scalarsample.correctedvalue),
max(scalarsample.qualityflag)
FROM
scalarsample
GROUP BY
scalarsample.sensorid,
trunc(scalarsample.sampletime,
'hh24') + (trunc(to_char(scalarsample.sampletime,
'mi'))) / 24 / 60 + (trunc(to_char(scalarsample.sampletime,
'ss') / 15) * 15) / 24 / 60 / 60
ORDER BY
tspan