溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

發(fā)布時間:2020-08-10 23:43:45 來源:ITPUB博客 閱讀:210 作者:chenoracle 欄目:關(guān)系型數(shù)據(jù)庫

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

--- 說明:案例來自《 收獲,不止SQL 優(yōu)化

請問:Oracle 可以針對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引嗎?比如 t1 id 列的數(shù)據(jù)有 1,2,3,4,5 ??梢灾会槍?/span> id=3 的數(shù)據(jù)創(chuàng)建索引嗎?

可以通過函數(shù)索引實現(xiàn)只針對id=3 的數(shù)據(jù)創(chuàng)建索引,例如 :

Create index i_t1_id on t(case when id=3 then 3 end);

請問:請舉一個具體案例,并說明在該場景下使用部分索引性能更好?

案例如下:

---創(chuàng)建測試表t

SQL >   create   table  t ( id   int   , status varchar2 ( 2 ));

--建立普通索引

SQL >   create   index  id_normal on  t ( status );

-- 插入數(shù)據(jù)

SQL >   insert   into  t select   rownum   , 'Y'   from  dual connect   by   rownum <= 100000 ;

SQL >   insert   into  t select   1   , 'N'   from  dual ;

SQL >   commit ;

---數(shù)據(jù)分布

SQL >   select   count (*), status from  t group   by  status ;

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

--- 收集統(tǒng)計信息

SQL >   analyze   table  t compute   statistics   for   table   for   all   indexes   for   all   indexed   columns ;

--- 查詢表 t ,查看執(zhí)行計劃

SQL >   set  linesize 1000

SQL >   set  autotrace traceonly

SQL >   select   *   from  t where  status = 'N' ;

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

-- 看索引 信息

SQL >   set  autotrace off

SQL >   analyze   index  id_normal validate   structure ;

SQL >   select   name , btree_space , lf_rows , height from  index_stats ;

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

備注 INDEX_STATS  存儲的是最近一次   ANALYZE INDEX ... VALIDATE STRUCTURE  語句的結(jié)果,最多只有 當(dāng)前會話的 一條數(shù)據(jù) 。

--- 創(chuàng)建函數(shù)索引的情況

SQL >   drop   index  id_normal ;

SQL >   create   index  id_status on   t ( Case   when  status =   'N'   then   'N'   end );

SQL >   analyze   table  t compute   statistics   for   table   for   all   indexes   for   all   indexed   columns ;

--- 再次查看執(zhí)行計劃

SQL >   set  autotrace traceonly

SQL >   select   *   from  t where   ( case   when  status = 'N'   then   'N'   end )= 'N' ;

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

--觀察id_status索引的情況

SQL >   set  autotrace off

SQL >   analyze   index  id_status validate   structure ;

SQL >   select   name , btree_space , lf_rows , height from  index_stats ;

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

--- 在對比下之前普通索引的值

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

結(jié)論: 普通索引改成函數(shù)索引后,索引當(dāng)前分配的空間 (BTREE_SPACE) 20230168 降到 7996 , , 邏輯讀consistent gets 5 降到 2 ,索引葉子數(shù) (LF_ROWS) 100001 降到 1 ,索引高度 (HEIGHT) 3 降到 1 ,性能有所提升。

歡迎關(guān)注我的微信公眾號"IT小Chen",共同學(xué)習(xí),共同成長?。?!

Oracle 對某列的部分?jǐn)?shù)據(jù)創(chuàng)建索引

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI