在生产环境中,如果发现某SQL执行慢,要查看它的执行计划,可先查v$sqltext获得HASH_VALUE值,再通过HASH_VALUE值查询v$sql_plan获得此SQL的实际执行计划。
实例:
想知道如下SQL的实际执行计划
SELECT /*+ index(tt IX_TT_CREATED_DATE) */ to_char(tt.created_date,'YYYY-MM-DD'),count(1)
FROM test_table tt
WHERE tt.code IN('X01', 'X02', 'X333', 'X365')
AND tt.created_time >= TO_DATE('2014-12-20', 'yyyy-mm-dd')
AND tt.created_time < TO_DATE('2015-08-20', 'yyyy-mm-dd')
group by to_char(tt.created_time,'YYYY-MM-DD');
先查询v$sqltext获得HASH_VALUE值,如果未查询到记录,则可以先执行一下上面的SQL后再查
select * from v$sqltext t where t.SQL_TEXT like 'SELECT /*+ index(pbi IX_PBI_CREATED_DATE) */%'
上面SQL执行的结果中的HASH_VALUE的值为3042406205,那么我们可以以它作为条件再查询v$sql_plan获得实际的执行计划。
select * from v$sql_plan t where t.HASH_VALUE = '3042406205';
运行结果如下所示: