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>,這是一個複雜型別的關聯。我們選擇一個示例來回顧下,比如:一個部落格有一個使用者,關聯對映就工