1. 程式人生 > >Oracle的級聯查詢(CONCATENATION)

Oracle的級聯查詢(CONCATENATION)

在where條件中使用OR或者函式,可能會導致Oracle選擇CONCATENATION這種方式。

OR的分析在網上有一些文章,可以搜尋查閱,本文不做討論,僅針對使用函式的情況做分析。

SQL片段如下,涉及到保密機制,表名、欄位名、函式名已替換,不影響閱讀。

SELECT COUNT(1)
  FROM T_A
 WHERE EXISTS (SELECT 1
          FROM T_B
         WHERE B.C_1 = A.C_1
           AND B.C_2 = :B4)
   AND C_3 IN (:B2, F_1(:B2))
   AND C_4 = :B1
   AND C_5 = '1'
帶函式的執行計劃
Discription Cost Cardinality Bytes Cpu Cost
SELECT STATEMENT, GOAL = ALL_ROWS 18 1 48 142972
 SORT AGGREGATE 1 48
CONCATENATION
   NESTED LOOPS SEMI 9 1 48 69961
    NESTED LOOPS 6 1 38 46819
     TABLE ACCESS BY INDEX ROWID 4 1 29 29636
      INDEX RANGE SCAN 3 1 21764
     TABLE ACCESS BY INDEX ROWID
2 1 9 17183
      INDEX UNIQUE SCAN 1 1 9021
    TABLE ACCESS BY INDEX ROWID 3 771549 7715490 23142
     INDEX RANGE SCAN 2 1 15493
   NESTED LOOPS SEMI 9 1 48 73011
    NESTED LOOPS 6 1 38 49869
     TABLE ACCESS BY INDEX ROWID 4 1 29 32686
      INDEX RANGE SCAN 3 1 24814
     TABLE ACCESS BY INDEX ROWID
2 1 9 17183
      INDEX UNIQUE SCAN 1 1 9021
    TABLE ACCESS BY INDEX ROWID 3 771549 7715490 23142
     INDEX RANGE SCAN 2 1 15493

優化思路:在程式中優先執行函式,將結果儲存在另外一個變數中,然後將變數寫入SQL,則可避免執行計劃走CONCATENATION

SELECT COUNT(1)
  FROM T_A
 WHERE EXISTS (SELECT 1
          FROM T_B
         WHERE B.C_1 = A.C_1
           AND B.C_2 = :B4)
   AND C_3 IN (:B2,:B3)
   AND C_4 = :B1
   AND C_5 = '1'
不帶函式時的執行計劃
Discription Cost Cardinality Bytes Cpu Cost
SELECT STATEMENT, GOAL = ALL_ROWS 11 1 48 99047
 SORT AGGREGATE 1 48
  NESTED LOOPS 11 1 48 99047
   NESTED LOOPS 11 1 48 99047
    NESTED LOOPS 8 1 38 75906
     INLIST ITERATOR
      TABLE ACCESS BY INDEX ROWID 6 1 29 58723
       INDEX RANGE SCAN 4 2 43329
     TABLE ACCESS BY INDEX ROWID 2 1 9 17183
      INDEX UNIQUE SCAN 1 1 9021
    INDEX RANGE SCAN 2 1 15493
   TABLE ACCESS BY INDEX ROWID 3 1 10 23142

通過以上兩個計劃對比,可見優化後各項指標均有下降,特別是資料獲取量上大幅下降。

相關推薦

Oracle查詢(CONCATENATION)

在where條件中使用OR或者函式,可能會導致Oracle選擇CONCATENATION這種方式。 OR的分析在網上有一些文章,可以搜尋查閱,本文不做討論,僅針對使用函式的情況做分析。 SQL片段如下

Oracle查詢

增刪改查是最基本的業務,也是變化和要求最多的業務,那麼原始需求如下: 假如一個A對應N個B,一個B對應N個C,一個C對應N個D 資料量為 幾百 幾千 幾萬 百萬 有什麼比較好的方法把這個表格查出來嗎? 一拍腦袋,我就想出兩個辦法: 先查10個

ORACLE資料庫的查詢

背景描述存在一張表資訊如下:titlefather水果top蘋果水果荔枝水果香蕉水果電器top冰箱電器洗衣機電器電視電器西瓜水果資料庫儲存的資料為無序的,需求描述為按照水果--屬於水果的二級--電器--

mybatis查詢,分步查詢和延遲加載

enabled 4.2 res 標簽 mapper last pac mes 方式 級聯查詢: 1.Employee表: id;lastName;email; gender;d_id(外鍵關聯Department的ID) 2.Department表: id;deptNa

Mybatis查詢

username tac 實現 數據 配置 級聯查詢 builder java 3.0 轉自:http://blog.csdn.net/yulei_qq/article/details/22039815 工程的目錄結構: 有兩個表,一個文章表article ,一個用戶表u

jpa @onetomany 查詢時會有重復數據,去重問題

hset 謝謝 好的 .get das net pre hashset campaign 自己是直接查出來然後利用set去重(自己感覺不是太好,不過能達到目的) List<CampaignDashboardDimensionDo> list = query.ge

Spring Data Jpa 基於註解的查詢

公司最近還是在使用spring data jpa,自己練習時遇到一些坑,記錄一下 首先描述一些業務邏輯: 一共有兩張表,一張學生表,一張公司表,學生與公司屬於一對多的關係,即一個學生只能屬於一個公司,但是一個公司可以擁有多名學生 學生實體類: package com.sj.Entit

【SSH網上商城專案實戰05】完成資料庫的查詢和分頁

  轉自:https://blog.csdn.net/eson_15/article/details/51320212 上一節我們完成了EasyUI選單的實現。這一節我們主要來寫一下CategoryServiceImpl實現類,完成資料庫的級聯查詢。一般專案從後往前做,先做se

hibernate查詢執行n+1次sqlt語句問題(內含解決辦法,優化方式)

如果當SQL資料庫中select語句數目過多,就會影響資料庫的效能,如果需要查詢n個Customer物件,那麼必須執行n+1次select查詢語句,下文就將為您講解這個n+1次select查詢問題。 在Session的快取中存放的是相互關聯的物件圖。預設情況下,

Hibernate:查詢

案例:訂單類和訂單項類 級聯查詢時的問題     Lazy=true介紹    查單個時存在問題       Lazy=false介紹    查所有時存在問題       在set裡把lazy=“false”也可以所報的錯(com.zking.four.entity.Ord

hibernate的關聯,一對多(新增,查詢,普通刪除)

一、什麼是關聯(association) 1、關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。 2、關聯的分類:關聯可以分為一對一、一對多/多對一、多對多關聯 關聯是有方向的 關聯的關鍵點都在外來鍵上 二、如何建立一對多雙向

一對多(新增,查詢,刪除)

1. 什麼是關聯(association)   1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:       public class A{         private B b = new B;         publ

hiberbate一對多的新增和查詢刪除

1. 什麼是關聯(association) 1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如: public class A{ private B b = new B; public A(){} } 1.2 關聯

connect by 查詢

1、建表、插入測試資料 create table t_menu(id int,name varchar2(50),parentId int); 2、測試查詢 (1)查詢 以id=1為起始值 及其下所有子孫; select * from t_menu

MyBatis的查詢(兩種方式)

https://blog.csdn.net/zhupengqq/article/details/78575767 與上次唯一不同的一下幾個類 Department.java package com.cn.zhu.bean;   public class Department

easyUI框架下使用下拉框的查詢

在使用easyui框架中,我們需要用到一個涉及很多表的的級聯查詢,傳統的做法是,先通過ajax拿到選中的id去資料庫查詢相應的list資料,然後再ajax的success方法中appendTo到下一個下拉框中,但這次我們使用easyUI,其實原理都是相同的,只是easyUI

QBC(Criteria)查詢 投影查詢

多表級聯查詢 下面是原始碼: public List webQBCfindbyorderone(String Addr) { // 獲得Criteria物件

jsp 分類查詢 selected

1.這個條件是你已經從資料庫中把分類的全部資料 封裝到一個list集合裡面了。例如:城市集合。。List<City> cityList        這個city裡面封裝了區<西湖區/拱墅區等>

pg資料庫多表查詢(inner)和查詢

一、資料庫的多表連線查詢,inner的不同用法在pg資料庫中建立兩張表:t_a和t_b如下所示:t_a:t_b:1、inner join(內連線)inner join就是根據on欄位標示出來的條件,查詢關聯的表中符合條件的資料,並把他前部都顯示出來,形成一個結果集。執行如下語

mybatis ---- 查詢 一對多 (集合對映)

關聯有巢狀查詢和巢狀結果兩種方式,本文是按照巢狀結果這種方式來說明的 上一章介紹了多對一的關係,用到了<association></association>,這是一個複雜型別的關聯。我們選擇一個示例來回顧下,比如:一個部落格有一個使用者,關聯對映就工