rows算錯導致錯誤的笛卡爾積造成temp不足
今天一哥們發來一條sql說一直不出結果,最後報錯:ORA-01652: 無法通過 128 (在表空間 TEMP 中) 擴充套件 temp 段
select tran_info.*, rp.mcc_typ_id, urm2.org_no, trim(urm2.rate_type) as rate_type, (case when tran_info.oldSXF < urm2.max_fee_amt then '0' when tran_info.oldSXF >= urm2.max_fee_amt then '1' else '0' end) as iSCap from biz_test.T_BIZ_SINGLE_FEE_TEMP tran_info, (select mst.* from biz_test.T_BIZ_MERC_SCOPE_TEMP mst where mst.merc_id not in (select merc_id from biz_test.T_BIZ_SPECIAL_MERC bsm where bsm.spec_type = '2' and bsm.is_used = '1')) urm2, biz_test.t_mcc rp where tran_info.merc_id = urm2.merc_id and tran_info.mcc_cd = rp.mcc_cd
解釋:執行計劃裡面有笛卡爾積MERGE JOIN CARTESIAN,單看SQL的話,是不可能產生笛卡爾積的,所以這個問題統計資訊不準導致ROWS算成了1(越是小表ROWS越有可能算成1)。優化器則認為其走的正確的笛卡爾積【什麼是正確的笛卡爾積,什麼是錯誤的笛卡爾積?】假設一個表的資料是30w ,被算成了1 走笛卡爾積,那麼結果集就要被放大30w倍,所以導致temp不足報錯也在情理之中
處理方法:
1.加hint,根據表的大小讓其強制走hash 或者 nl
寫hint很容易眼高手低,而且優化器的版本不同hint的格式也有微小的差別
2.收集統計資訊:系統自帶有,DBA也會做相應的策略總結:
rows算錯的情況在執行計劃中經常存在,大多都是因為rows算小了,一般會引起兩種錯誤的執行計劃rows算成1 錯誤的笛卡爾積,執行計劃裡面笛卡爾積關鍵字和rowsrows算小了本來應該HASH 結果走了NL,這時候邏輯讀會大的很離譜
相關推薦
rows算錯導致錯誤的笛卡爾積造成temp不足
今天一哥們發來一條sql說一直不出結果,最後報錯:ORA-01652: 無法通過 128 (在表空間 TEMP 中) 擴充套件 temp 段 select tran_info.*, rp.mcc_typ_id, urm2.org_no,
Oracle(二)- 笛卡爾積造成的問題(一)
問題sql: select /*+rule */ a.unoin,a.name,b.product_id,c.partiname from pc_union_detail a,sp_product_all b,bf_dict c where a.union_id=b.uni
多數組組合笛卡爾積算法
length 卡爾 ring private == mmm null 數組組合 lis private string[] bianli(List<string[]> al) { if (al.Count == 0)
js編寫一個數組笛卡爾積算法
con str console class span [] 個數 nts 一個數 function getProducts(specs) { if (!specs || specs.length == 0) { return []; } e
實操-mysql表連接笛卡爾積(join、left join)
卡爾 desc 順序 join mysql png blog 關系 方式 1、為什麽兩張表連接會出現重復數據 2、表的連接過程是怎樣的? 舉例: 表A: 1 0 表B: 1 0 0 2 執行語句:select *
還需要註冊的是我們還有一個是“交差集”?cross?join,?這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下:
笛卡爾 tab 表達 但是 rom 產生 OS 是我 語法 還需要註冊的是我們還有一個是"交差集" cross join, 這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數據進行一個N*M的組合,即笛卡爾積。表達式如下: SELEC
sql中的笛卡爾積
簡單的 有序 想要 所有 rod car strong 多表 笛卡爾 sql中的笛卡爾積 我們對數據庫表進行操作時,經常會對多張表進行關聯,多表連接查詢大家肯定不會陌生,但是一不小心很容易出來龐大冗余的數據。 笛卡爾積數學概念 笛卡爾積是
關於笛卡爾積陷阱的實例
實例 我們 進行 select distinct values reat ont 卡爾 下面的代碼演示了笛卡爾積陷阱的相關實例。 /*當我們采用以下語句進行查詢的時候,得到的結果遠超過我們需要的量。*/select a.userID,B.username,A.value,
php中將多個數組組合成笛卡爾積
在做商品屬性時設計到多個屬性直接引數的組合,因此用到了笛卡爾積這個概念。主要函式原理是利用遞迴的原理和求兩個陣列的笛卡爾積。 首先是陣列結構,如下:也可以根據實際情況修改為$a = Array();$b=Array();即可。 array (size=2) 0 =>
PHP笛卡爾積
先附上原地址:https://www.cnblogs.com/ghjbk/p/6992743.html?utm_source=itdadao&utm_medium=referral 笛卡爾積 笛卡爾積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又
python中笛卡爾積原始碼及實際使用
問題:對於多個集合或列表,每次只從這多個集合或列表中取出一個元素,求所有的組合方式? 如何自己寫可能就想到多重for迴圈,但是,當使用多重for迴圈時,如果集合或列表數過多,則非常繁瑣! python標準庫提供了笛卡爾積這一方法:itertools.product() 原始碼:(改動了一
mysql 內連線、左連線會出現笛卡爾積?
這周的部門週會,分享的同事說的是資料庫優化相關,過程中,一個同事跟我討論左連線查詢,是不是笛卡爾積。我第一反應,左連線肯定不是笛卡爾積啊,左連線是以左表為準,左表有m條記錄,則結果集是m條記錄(哈哈,如果是你,你是不是也是這樣的反映),同事聽了,說內連線會是笛卡爾積。聽到這句話的我的
《資料庫技巧》資料庫兩個表求笛卡爾積(階乘)
最近遇到了一個需求:使用者在客戶端頁面上進行資料錄入,下拉列表的選擇,然後使用者對頁面資料進行提交。後臺要根據客戶端傳來的資料進行分析,並且生成一串數字,將該數字串進行儲存。 介紹之前,我們要了解本文的一個名詞【笛卡爾積】,同俗的來講,就是數學中的排列組合。
mysql 等值連線、自然連線與笛卡爾積
1.等值連線(where子句中使用=等號為限定條件) SELECT * FROM runoob_tb a, tcount_tb b WHERE a.runoob_author = b.runoob_author; 2. 自然連線 NATURAL JOIN (自然連線只考慮屬
python 笛卡爾積
from itertools import product for x,y,z in product([{'a':'1'}],[{'s':'1'},{'s':'2'}],[{'fp':'1'},{'fp':'5'},{'fp':'10'}]): print(x,y,z) 結果:
面試題——笛卡爾積
0.前言 最近參加某公司的面試,問到了一個用到笛卡爾的SQL題目,非常有意思,特此總結如下: 1.問題描述 現有一個表 t_table,只有一個欄位 ID,該表有十條資料 0-9
MongoDB查詢實現 笛卡爾積,Union All 和Union 功能
此篇文章及以後的文章大部分都是從聚合管道(aggregation pipeline)的一些語法為基礎講解的,如果不理解聚合管道的話,可以先學習一下會比較容易理解. 可以參考 mongoDB Documentation 的 Pipeline Aggregaion Stag
計算笛卡爾積的泛型方法
private <T> List<List<T>> cartesianProduct(List<List<T>> lists) { List<List<T>> resultLi
19 Oracle資料庫SQL開發之 笛卡爾積
19.Oracle資料庫SQL開發之 笛卡爾積如果在多表查詢中不指定連線條件,就會導致將一個表中的所有行都連線到另外一個表中的所有行上。稱為笛卡爾積。如果第一個表包含50行,第二個表包含100行,那麼將返回5000行。例如:SQL>select pt.product_ty
MYSQL之笛卡爾積
首先,先簡單解釋一下笛卡爾積。 現在,我們有兩個集合A和B。 A = {0,1} B = {2,3,4} 集合 A×B 和 B×A的結果集就可以分別表示為以下這種形式: A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}