Wednesday, April 30, 2008

Find sequence gaps using Oracle's analytic functions

The following query will give you the gaps exactly :
Insert one more record...


INSERT INTO sensor_data VALUES ('UNIT1',10,1.235,SYSDATE);

COMMIT;

SELECT measurement_id - gap gap_from, measurement_id - 1 gap_to
FROM ( SELECT measurement_id, CASE measurement_id - NVL((LAG(measurement_id) OVER (ORDER BY measurement_id)),0)
WHEN 1
THEN 0
ELSE measurement_id - (LAG(measurement_id)
OVER (ORDER BY measurement_id)) -1
END gap
FROM sensor_data )
WHERE gap > 0;

Output will look like:
-GAP_FROM GAP_TO
3 3
6 6
8 9

Hope you find this useful.

How to get the 100 most expensive sql statements

The below sql statement will give the 100 most expensive sql statements for a scpecific user,in the following example i run it for user SCOTT.

SELECT *
FROM (SELECT SQL_TEXT, B.USERNAME, ROUND(ELAPSED_TIME / 1000000, 3) ELAPSED_TIME_SECS,
ROUND((A.DISK_READS / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS)), 2) AS DISK_READS_PER_EXEC,
A.DISK_READS, A.BUFFER_GETS,
ROUND((A.BUFFER_GETS / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS)), 2) AS BUFFER_GETS_PER_EXEC,
A.PARSE_CALLS, A.SORTS, A.EXECUTIONS, A.LOADS, A.ROWS_PROCESSED,
100 - ROUND(100 * A.DISK_READS / GREATEST(A.BUFFER_GETS, 1), 2) AS HIT_RATIO,
A.FIRST_LOAD_TIME, SHARABLE_MEM, PERSISTENT_MEM, RUNTIME_MEM, ROUND(CPU_TIME / 1000000, 3) AS CPU_TIME_SECS,
ROUND((CPU_TIME / 1000000) / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS), 3) AS CPU_TIME_SECS_PER_EXECUTE,
ROUND((ELAPSED_TIME / 1000000) / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS), 3) AS ELAPSED_TIME_SECS_PER_EXECUTE, ADDRESS, HASH_VALUE
FROM V_$SQLAREA A, ALL_USERS B
WHERE A.PARSING_USER_ID = B.USER_ID
AND B.USERNAME IN ('SCOTT')
ORDER BY ELAPSED_TIME DESC)
WHERE ROWNUM <>