1. 程式人生 > >李鬼989的專欄

李鬼989的專欄

這是原始的sql
select COUNT(1)
  from veh_passrec ve
 where ve.hphm = '湘E4TT52'
   and ve.gcsj > to_date('2016-06-12 17:16', 'yyyy-mm-dd hh24:mi:ss')
   and ve.GCSJ < to_date('2016-06-13 17:16', 'yyyy-mm-dd hh24:mi:ss')
 order by ve.GCSJ asc;

查詢時快時慢,我們藉助pl/sql來看看它的執行計劃:可以看到,當優化目標為rule時,它是進行的全表掃描


當優化目標為choose時,它是走的索引


實際是,當我們沒有指定索引時,資料庫會按照自己認為的最優化的方式去執行.

接下來,我們將這條sql優化一下,給它指定索引,在統計個數時,是可以把排序去掉的,而且統計個數時最好不要多表關聯查詢.優化之後就是這樣子的了

select /*+index(ve INDEX_PASSREC_HPHM_GCSJ)+*/
 COUNT(1)
  from veh_passrec ve
 where ve.hphm = '湘E4TT52'
   and ve.gcsj > to_date('2016-06-12 17:16', 'yyyy-mm-dd hh24:mi:ss')
   and ve.GCSJ < to_date('2016-06-13 17:16', 'yyyy-mm-dd hh24:mi:ss')

我們再來看看它的執行計劃,當選擇rule時

當選擇choose時