1. 程式人生 > >rows算錯導致錯誤的笛卡爾積造成temp不足

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)}