国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

數據庫調優:如何優化in操作

2024-07-21 02:32:43
字體:
來源:轉載
供稿:網友

  今天開發人員讓我優化一個sql: 數據庫調優:如何優化in操作(圖一)Select Item.*數據庫調優:如何優化in操作(圖一)From Item Item數據庫調優:如何優化in操作(圖一)Where Item.Item_Id in (15056, 14697);  這個item表很大,sql執行起來很慢。數據庫調優:如何優化in操作(圖一)Execution Plan數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12795 Card=2 Bytes=1數據庫調優:如何優化in操作(圖一)316)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)1 0 TABLE access (FULL) OF 'ITEM' (Cost=12795 Card=2 Bytes=131數據庫調優:如何優化in操作(圖一)6)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)Statistics數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 recursive calls數據庫調優:如何優化in操作(圖一)0 db block gets數據庫調優:如何優化in操作(圖一)134234 consistent gets數據庫調優:如何優化in操作(圖一)26568 physical reads數據庫調優:如何優化in操作(圖一)2184 redo size數據庫調優:如何優化in操作(圖一)3336 bytes sent via SQL*Net to client數據庫調優:如何優化in操作(圖一)503 bytes received via SQL*Net from client數據庫調優:如何優化in操作(圖一)2 SQL*Net roundtrips to/from client數據庫調優:如何優化in操作(圖一)0 sorts (memory)數據庫調優:如何優化in操作(圖一)0 sorts (disk)數據庫調優:如何優化in操作(圖一)2 rows PRocessed
  在這個例子中,item_id是item表的主鍵。這里慢的原因是in操作不能用到索引,做全表掃描,但為什么不能用索引呢?

  實際上,Oracle在處理in的時候是轉換成or進行處理的,如:

  a in (1,2)相當于 a=1 or a=2

  而對于b*tree索引來說,對于or操作是不會用到索引的。知道原因,下面就要找出解決方法了。  方法一、從b*tree索引著手

  這種方法就是想辦法讓查詢可以走b*tree索引。要走BTree索引,就要去掉or操作,所以把查詢改成一個等價的sql:數據庫調優:如何優化in操作(圖一)SQL> Select Item.* From Item Item Where Item.Item_Id in (14697)數據庫調優:如何優化in操作(圖一)2 union all數據庫調優:如何優化in操作(圖一)3 Select Item.* From Item Item Where Item.Item_Id in (15056);數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)Execution Plan數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=2 Bytes=1316)數據庫調優:如何優化in操作(圖一)1 0 UNION-ALL數據庫調優:如何優化in操作(圖一)2 1 TABLE ACCESS (BY INDEX ROWID) OF 'ITEM' (Cost=3 Card=1 B數據庫調優:如何優化in操作(圖一)ytes=658)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)3 2 INDEX (UNIQUE SCAN) OF 'PK_ITEM' (UNIQUE) (Cost=2 Card數據庫調優:如何優化in操作(圖一)=1)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)4 1 TABLE ACCESS (BY INDEX ROWID) OF 'ITEM' (Cost=3 Card=1 B數據庫調優:如何優化in操作(圖一)ytes=658)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)5 4 INDEX (UNIQUE SCAN) OF 'PK_ITEM' (UNIQUE) (Cost=2 Card數據庫調優:如何優化in操作(圖一)=1)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)Statistics數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 recursive calls數據庫調優:如何優化in操作(圖一)0 db block gets數據庫調優:如何優化in操作(圖一)8 consistent gets數據庫調優:如何優化in操作(圖一)0 physical reads數據庫調優:如何優化in操作(圖一)0 redo size數據庫調優:如何優化in操作(圖一)3334 bytes sent via SQL*Net to client數據庫調優:如何優化in操作(圖一)503 bytes received via SQL*Net from client數據庫調優:如何優化in操作(圖一)2 SQL*Net roundtrips to/from client數據庫調優:如何優化in操作(圖一)0 sorts (memory)數據庫調優:如何優化in操作(圖一)0 sorts (disk)數據庫調優:如何優化in操作(圖一)2 rows processed
  從輸出結果可以看出,sql已經可以有索引了,效率也得到大幅提高。但這種辦法有缺陷:
假如in list的個數不確定,且假如in list較多的話,拼sql都是一個問題。我這個應用就是這種情況。  方法二、從位圖方式著手

  我們知道,位圖索引是可以被or操作使用的,我們可以根據這一特點先用btree索引查詢數據,然后進行位圖轉換、聯合。
oracle給我們提供了一個hint來解決這個問題:use_concat。原sql修改為:數據庫調優:如何優化in操作(圖二)數據庫調優:如何優化in操作(圖三)SQL> Select /**//*+ use_concat */
Item.* From Item Item Where Item.Item_Id in (15056,14697);數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)Execution Plan數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=2 Bytes=1316)數據庫調優:如何優化in操作(圖一)1 0 TABLE ACCESS (BY INDEX ROWID) OF 'ITEM' (Cost=6 Card=2 Byt數據庫調優:如何優化in操作(圖一)es=1316)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)2 1 BITMAP CONVERSION (TO ROWIDS)數據庫調優:如何優化in操作(圖一)3 2 BITMAP OR數據庫調優:如何優化in操作(圖一)4 3 BITMAP CONVERSION (FROM ROWIDS)數據庫調優:如何優化in操作(圖一)5 4 INDEX (RANGE SCAN) OF 'PK_ITEM' (UNIQUE) (Cost=2)數據庫調優:如何優化in操作(圖一)6 3 BITMAP CONVERSION (FROM ROWIDS)數據庫調優:如何優化in操作(圖一)7 6 INDEX (RANGE SCAN) OF 'PK_ITEM' (UNIQUE) (Cost=2)數據庫調優:如何優化in操作(圖一)數據庫調優:如何優化in操作(圖一)Statistics數據庫調優:如何優化in操作(圖一)----------------------------------------------------------數據庫調優:如何優化in操作(圖一)0 recursive calls數據庫調優:如何優化in操作(圖一)0 db block gets數據庫調優:如何優化in操作(圖一)8 consistent gets數據庫調優:如何優化in操作(圖一)0 physical reads數據庫調優:如何優化in操作(圖一)0 redo size數據庫調優:如何優化in操作(圖一)3336 bytes sent via SQL*Net to client數據庫調優:如何優化in操作(圖一)503 bytes received via SQL*Net from client數據庫調優:如何優化in操作(圖一)2 SQL*Net roundtrips to/from client數據庫調優:如何優化in操作(圖一)0 sorts (memory)數據庫調優:如何優化in操作(圖一)0 sorts (disk)數據庫調優:如何優化in操作(圖一)2 rows processed
  從結果可以看到,oracle先通過主鍵索引分別對兩個id進行查詢,然后轉換成位圖進行合并,這樣效率就得到提供,對原sql的改動也很小,基本滿足了要求。

  本文所有結果都是基于linux as 3+ oracle9204平臺。  這個轉換受_b_tree_bitmap_plans決定。假如該參數為true,則可進行轉換,否則不進行轉換。而8i里,該參數缺省為false,所以只有存在bitmap索引時才會考慮將B樹索引轉換為bitmap; 而到了9i里,該參數缺省為true了,則對任何索引都有可能進行bitmap轉換。  順便提一下,今天在itpub有帖子講到in能否用到btree索引問題,我這里總結一下:
  1、假如in list是具體的term,如id in (1,1,2)之類的話,是不會用到b*tree的
  2、假如in list是有一個子查詢得到的,如id in (select id from t2),那么這個查詢實際兩表關聯。那么能否用到id列的索引要受到很多因素的制約了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永康市| 邵武市| 清苑县| 沙坪坝区| 扬州市| 宜州市| 玉田县| 南丰县| 喀喇沁旗| 福清市| 呼伦贝尔市| 仁布县| 襄樊市| 庄浪县| 盱眙县| 临汾市| 枣阳市| 三门县| 新密市| 建阳市| 星座| 冀州市| 叙永县| 宝清县| 江达县| 临邑县| 乌海市| 铜川市| 临汾市| 苗栗市| 西乌珠穆沁旗| 东乌珠穆沁旗| 江油市| 兴宁市| 镇巴县| 安平县| 民丰县| 汕尾市| 张掖市| 芦溪县| 东方市|