婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何利用分析函數改寫范圍判斷自關聯查詢詳解

如何利用分析函數改寫范圍判斷自關聯查詢詳解

熱門標簽:小程序智能電話機器人 怎么申請400熱線電話 河北便宜電銷機器人軟件 泗洪正規電話機器人找哪家 簡單的智能語音電銷機器人 湖南保險智能外呼系統產品介紹 南昌呼叫中心外呼系統哪家好 ai電話電話機器人 怎么去開發一個電銷機器人

前言

最近碰到一個單條SQL運行效率不佳導致數據庫整體運行負載較高的問題。

分析、定位數據庫的主要負載是這條語句引起的過程相對簡單,通過AWR報告就可以比較容易的完成定位,這里就不贅述了。

現在直接看一下這個導致性能問題的SQL語句,其對應的SQL REPORT統計如下:

Stat Name Statement Total Per Execution % Snap Total
Elapsed Time (ms) 363,741 363,740.78 8 .42
CPU Time (ms) 362,770 362,770.00 8 .81
Executions 1    
Buffer Gets 756 756.00 0.00
Disk Reads 0 0.00 0.00
Parse Calls 1 1.00 0.01
Rows 50,825 50,825.00  
User I/O Wait Time (ms) 0  
Cluster Wait Time (ms) 0    
Application Wait Time (ms) 0    
Concurrency Wait Time (ms) 0    
Invalidations 0    
Version Count 1    
Sharable Mem(KB) 28    

從SQL的性能指標上看,其單次執行需要6分鐘左右,處理5萬多條記錄,邏輯度只有756,主要消耗時間在CPU上。而這里就存在疑點,邏輯讀如此之低,而CPU時間花費又如此之高,那么這些CPU都消耗在哪里呢?當然這個問通過SQL的統計信息中是找不到答案的,我們下面關注SQL的執行計劃:


Id Operation Name Rows Bytes TempSpc Cost (%CPU) Time
0 SELECT STATEMENT       1226 (100)  
1    SORT ORDER BY   49379 3375K 3888K 1226 (2) 00:00:05
2      HASH JOIN ANTI   49379 3375K 2272K 401 (3) 00:00:02
3        TABLE ACCESS FULL T_NUM 49379 1687K   88 (4) 00:00:01
4        TABLE ACCESS FULL T_NUM 49379 1687K   88 (4) 00:00:01

從執行計劃看,Oracle選擇了HASH JOIN ANTI,JOIN的兩張表都是T_NUM,且都采用了全表掃描,并未選擇索引。僅靠執行計劃也只等得到上面的結論,至于為什么不選擇索引,以及為什么執行時間過長,還需要進一步的分析。

將原SQL進行簡單脫密改寫后, SQL文本類似如下:

SELECT BEGIN, END, ROWID, LENGTH(BEGIN)
FROM T_NUM A
WHERE NOT EXISTS (
SELECT 1
FROM T_NUM B
WHERE B.BEGIN = A.BEGIN
AND B.END >= A.END
AND B.ROWID != A.ROWID
AND LENGTH(B.BEGIN) = LENGTH(A.BEGIN));

如果分析SQL語句,會發現這是一個自關聯語句,在BEGIN字段長度相等的前提下,想要找到哪些不存在BEGIN比當前記錄BEGIN小且END比當前記錄END大的記錄。

簡單一點說,表中的記錄表示的是由BEGIN開始到END截至的范圍,那么當前想要獲取的結果是找出哪些沒有范圍所包含的范圍。需要注意的是,對于當前的SQL邏輯,如果存在兩條范圍完全相同的記錄,那么最終這兩條記錄都會被舍棄。

業務的邏輯并不是特別復雜,但是要解決一條記錄與其他記錄進行比較,多半采用的方法是自關聯,而在這個自關聯中,既有大于等于又有小于等于,還有不等于,僅有的一個等于的關聯條件,來自范圍段BEGIN的長度的比較。

顯而易見的是,如果是范圍段本身的比較,其選擇度一般還是不錯的,但是如果只是比較其長度,那么無疑容易產生大量的重復,比如在這個例子中:

SQL> select length(begin), count(*) from t_num group by length(begin) order by 2 desc;

 

LENGTH(BEGIN) COUNT(*)

————- ———-

12  22096

11  9011

13  8999

14  8186

16   49

9   45

8   41

7   27

大量重復的數據出現在長度為11到14的范圍上,在這種情況下,僅有的一個等值判斷條件LENGTH(BEGIN)是非常低效的,這時一條記錄根據這個等值條件會關聯到近萬條記錄,設置關聯到兩萬多條記錄,顯然大量的實踐消耗在低效的連接過程中。

再來看一下具體的SQL語句,會發現幾乎沒有辦法建立索引,因為LENGTH(BEGIN)的選擇度非常查,而其他的條件都是不等查詢,選擇度也不會好,即使建立索引,強制執行選擇索引,效率也不會好。

那么如果想要繼續優化這個SQL,就只剩下一個辦法,那就是SQL的改寫。對于自關聯查詢而言,最佳的改寫方法是利用分析函數,其強大的行級處理能力,可以在一次掃描過程中獲得一條記錄與其他記錄的關系,從而消除了自關聯的必要性。

SQL改寫結果如下:

SELECT BEGIN, OLDEND END, LENGTH(BEGIN)
FROM (
SELECT BEGIN, OLDEND, END, LENGTH(BEGIN), COUNT(*) OVER(PARTITION BY LENGTH(BEGIN), BEGIN, OLDEND) CN,
ROW_NUMBER() OVER(PARTITION BY LENGTH(BEGIN), END ORDER BY BEGIN) RN
FROM
(
SELECT BEGIN, END OLDEND, MAX(END) OVER(PARTITION BY LENGTH(BEGIN) ORDER BY BEGIN, END DESC) END
FROM T_NUM
)
)
WHERE RN = 1
AND CN = 1;

簡單的說,內層的分析函數MAX用來根據BEGIN從小到大,END從大到小的條件,確定每個范圍對應的最大的END的值。而外層的兩個分析函數,COUNT用來去掉完全重復的記錄,而ROW_NUMBER用來獲取范圍最大的記錄(也就是沒有被其他記錄的范圍所涵蓋)。

改寫后,這個SQL避免對自關聯,也就不存在關聯條件重復值過高的性能隱患了。在模擬環境中,性能對比如下:

SQL> SELECT BEGIN, END, ROWID, LENGTH(BEGIN)

2 FROM T_NUM A

3 WHERE NOT EXISTS (

4  SELECT 1

5  FROM T_NUM B

6  WHERE B.BEGIN = A.BEGIN

7  AND B.END >= A.END

8  AND B.ROWID != A.ROWID

9  AND LENGTH(B.BEGIN) = LENGTH(A.BEGIN))

10 ;

 

48344 rows selected.

 

Elapsed: 00:00:57.68

 

Execution Plan

———————————————————-

Plan hash value: 2540751655

 

————————————————————————————

| Id | Operation   | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time  |

————————————————————————————

| 0 | SELECT STATEMENT |  | 48454 | 1703K|  | 275 (1)| 00:00:04 |

|* 1 | HASH JOIN ANTI |  | 48454 | 1703K| 1424K| 275 (1)| 00:00:04 |

| 2 | TABLE ACCESS FULL| T_NUM | 48454 | 851K|  | 68 (0)| 00:00:01 |

| 3 | TABLE ACCESS FULL| T_NUM | 48454 | 851K|  | 68 (0)| 00:00:01 |

————————————————————————————

 

Predicate Information (identified by operation id):

—————————————————

 

1 – access(LENGTH(TO_CHAR(“B”.”BEGIN”))=LENGTH(TO_CHAR(“A”.”BEGIN”)))

filter(“B”.”BEGIN”=”A”.”BEGIN” AND “B”.”END”>=”A”.”END” AND

“B”.ROWID>”A”.ROWID)

 

 

Statistics

———————————————————-

0 recursive calls

0 db block gets

404 consistent gets

0 physical reads

0 redo size

2315794 bytes sent via SQL*Net to client

35966 bytes received via SQL*Net from client

3224 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

48344 rows processed

 

SQL> SELECT BEGIN, OLDEND END, LENGTH(BEGIN)

2 FROM (

3  SELECT BEGIN, OLDEND, END, LENGTH(BEGIN), COUNT(*) OVER(PARTITION BY LENGTH(BEGIN), BEGIN, OLDEND) CN,

4    ROW_NUMBER() OVER(PARTITION BY LENGTH(BEGIN), END ORDER BY BEGIN) RN

5  FROM

6  (

7    SELECT BEGIN, END OLDEND, MAX(END) OVER(PARTITION BY LENGTH(BEGIN) ORDER BY BEGIN, END DESC) END

8    FROM T_NUM

9  )

10 )

11 WHERE RN = 1

12 AND CN = 1;

 

48344 rows selected.

 

Elapsed: 00:00:00.72

 

Execution Plan

———————————————————-

Plan hash value: 1546715670

 

——————————————————————————————

| Id | Operation    | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time  |

——————————————————————————————

| 0 | SELECT STATEMENT   |  | 48454 | 2460K|  | 800 (1)| 00:00:10 |

|* 1 | VIEW     |  | 48454 | 2460K|  | 800 (1)| 00:00:10 |

|* 2 | WINDOW SORT PUSHED RANK|  | 48454 | 1845K| 2480K| 800 (1)| 00:00:10 |

| 3 | WINDOW BUFFER   |  | 48454 | 1845K|  | 800 (1)| 00:00:10 |

| 4 |  VIEW     |  | 48454 | 1845K|  | 311 (1)| 00:00:04 |

| 5 |  WINDOW SORT   |  | 48454 | 662K| 1152K| 311 (1)| 00:00:04 |

| 6 |  TABLE ACCESS FULL | T_NUM | 48454 | 662K|  | 68 (0)| 00:00:01 |

——————————————————————————————

 

Predicate Information (identified by operation id):

—————————————————

 

1 – filter(“RN”=1 AND “CN”=1)

2 – filter(ROW_NUMBER() OVER ( PARTITION BY LENGTH(TO_CHAR(“BEGIN”)),”END”

ORDER BY “BEGIN”)=1)

 

 

Statistics

———————————————————-

0 recursive calls

0 db block gets

202 consistent gets

0 physical reads

0 redo size

1493879 bytes sent via SQL*Net to client

35966 bytes received via SQL*Net from client

3224 SQL*Net roundtrips to/from client

3 sorts (memory)

0 sorts (disk)

48344 rows processed

原SQL運行時間接近1分鐘,而改寫后的SQL語句只需要0.72秒,執行時間變為原本的1/80,邏輯讀減少一半。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL中三種關聯查詢方式的簡單比較
  • mysql中的跨庫關聯查詢方法
  • 淺談mysql中多表不關聯查詢的實現方法
  • MySQL中表子查詢與關聯子查詢的基礎學習教程
  • 實例講解Java的MyBatis框架對MySQL中數據的關聯查詢
  • MyBatis實踐之動態SQL及關聯查詢
  • mysql關聯子查詢的一種優化方法分析
  • Yii2實現跨mysql數據庫關聯查詢排序功能代碼
  • mysql一對多關聯查詢分頁錯誤問題的解決方法

標簽:荊門 柳州 淮安 景德鎮 江蘇 威海 那曲 瀘州

巨人網絡通訊聲明:本文標題《如何利用分析函數改寫范圍判斷自關聯查詢詳解》,本文關鍵詞  如何,利用,分析,函數,改寫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何利用分析函數改寫范圍判斷自關聯查詢詳解》相關的同類信息!
  • 本頁收集關于如何利用分析函數改寫范圍判斷自關聯查詢詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美三级视频在线| 国产黄色91视频| 日韩中文字幕一区二区三区| 色老综合老女人久久久| 中文字幕亚洲一区二区av在线| 免费一级欧美片在线观看| 欧美三级日韩在线| 日本少妇一区二区| 久久久九九九九| 国产成人啪免费观看软件| 国产日产欧美一区二区三区| 成人av在线资源| 一区二区三区四区激情| 欧美日韩免费观看一区三区| 久久精品国产精品青草| 欧美国产日韩一二三区| 色老头久久综合| 天天综合色天天综合色h| 久久综合久久综合九色| 不卡视频一二三四| 亚洲国产wwwccc36天堂| 26uuu亚洲综合色欧美| 一本到不卡精品视频在线观看| 五月激情六月综合| 国产欧美视频一区二区| 在线亚洲一区观看| 久草在线在线精品观看| 亚洲黄色小说网站| 国产无人区一区二区三区| 99re这里只有精品视频首页| 久色婷婷小香蕉久久| 亚洲色图欧美在线| 日韩一区二区三区观看| 99久久久精品| 国产综合色精品一区二区三区| 136国产福利精品导航| 日韩三级av在线播放| 东方欧美亚洲色图在线| 天堂av在线一区| 亚洲视频综合在线| 久久综合久久久久88| 欧美日韩国产精品自在自线| 国产一区在线观看视频| 午夜欧美视频在线观看| 国产欧美日韩在线| 日韩精品一区二区三区老鸭窝| 成人av电影在线网| 国产在线看一区| 亚洲va欧美va人人爽| 亚洲免费毛片网站| 国产日韩欧美制服另类| 久久一区二区三区四区| 91精品在线麻豆| 欧美亚洲丝袜传媒另类| 在线亚洲一区二区| www.欧美.com| av动漫一区二区| 国产suv一区二区三区88区| 久久丁香综合五月国产三级网站 | 国产精品亚洲视频| 日韩影院精彩在线| 午夜久久电影网| 亚洲综合成人网| 一区二区三区在线播放| 一色桃子久久精品亚洲| 国产精品九色蝌蚪自拍| 欧美激情一区二区三区全黄| 国产亚洲精品免费| 国产亚洲欧美日韩俺去了| 精品国产在天天线2019| 久久综合五月天婷婷伊人| 国产性色一区二区| 国产欧美精品在线观看| 中文字幕视频一区| 亚洲免费在线视频一区 二区| 亚洲欧洲另类国产综合| 亚洲精品精品亚洲| 一区二区三区不卡视频| 亚洲国产aⅴ天堂久久| 日韩电影在线一区二区| 免费精品视频在线| 国产成人精品免费看| 懂色一区二区三区免费观看| 99精品视频一区二区三区| 在线精品观看国产| 欧美一区二区三区不卡| 国产亚洲成av人在线观看导航 | 亚洲欧洲美洲综合色网| 国产成人免费高清| 成人a免费在线看| 99久久精品国产麻豆演员表| 色噜噜狠狠色综合中国| 91精品国产综合久久精品| 日韩精品影音先锋| 久久伊99综合婷婷久久伊| 自拍偷在线精品自拍偷无码专区 | 成人动漫在线一区| 91九色最新地址| 日韩一区二区免费在线观看| 国产丝袜美腿一区二区三区| 亚洲日本va午夜在线电影| 午夜精品成人在线视频| 国产一区二区三区黄视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产v综合v亚洲欧| 欧美日韩国产综合一区二区三区 | 91黄色小视频| 亚洲精品一区二区三区四区高清| 国产精品乱码一区二三区小蝌蚪| 亚洲一区二区av电影| 国产黄色成人av| 欧美人与禽zozo性伦| 欧美激情一区二区三区不卡| 亚洲成a人片在线观看中文| 国产精品中文字幕日韩精品| 欧美体内she精高潮| 国产精品欧美一级免费| 久久99久久久久久久久久久| 欧美在线不卡视频| 国产精品午夜春色av| 日韩主播视频在线| 色哟哟亚洲精品| 国产天堂亚洲国产碰碰| 久久精品国产**网站演员| 91国偷自产一区二区三区成为亚洲经典 | 7777女厕盗摄久久久| 亚洲欧美日本在线| 国产精品一区二区你懂的| 欧美日韩精品二区第二页| 一区二区欧美在线观看| 99riav久久精品riav| 中文字幕永久在线不卡| 成人小视频在线| 26uuu国产一区二区三区| 日韩福利视频导航| 欧美日韩国产乱码电影| 午夜精品影院在线观看| 精品视频1区2区| 亚洲高清久久久| 欧美日韩亚洲综合| 天堂一区二区在线免费观看| 91麻豆精品国产91久久久使用方法 | 久久精品视频一区二区| 国产在线精品一区二区夜色| 欧美一级一区二区| 男男成人高潮片免费网站| 欧美日韩三级在线| 免费高清在线一区| 精品女同一区二区| 国产最新精品免费| 国产精品视频一二| 色婷婷久久久综合中文字幕 | 中文字幕不卡在线| 成人教育av在线| 亚洲精品国产第一综合99久久 | 亚洲第一精品在线| 欧美精品1区2区3区| 久久99九九99精品| 成人午夜免费电影| 一区二区三区不卡在线观看| 91精品国产欧美一区二区| 国产一二精品视频| 亚洲日本丝袜连裤袜办公室| 欧美日韩国产系列| 国产乱码精品1区2区3区| 国产精品免费aⅴ片在线观看| 色狠狠av一区二区三区| 蜜臀久久99精品久久久久久9| 国产农村妇女精品| 色先锋久久av资源部| 麻豆精品一二三| 国产精品天天看| 欧美视频中文一区二区三区在线观看 | 国产日韩av一区| 欧美天天综合网| 国产乱人伦偷精品视频不卡| 亚洲欧美一区二区三区孕妇| 日韩欧美国产1| 91久久线看在观草草青青| 精品一区二区三区免费| 一区二区三区毛片| 久久久久久免费毛片精品| 在线视频欧美精品| 国产成人综合网站| 午夜婷婷国产麻豆精品| 欧美国产精品久久| 精品国产髙清在线看国产毛片| 色视频一区二区| 不卡视频在线观看| 国产精品一区二区三区四区 | 国产一区二区三区黄视频 | 精品少妇一区二区三区免费观看| 色综合网站在线| 国产美女在线精品| 午夜精品久久久久影视| 亚洲美女偷拍久久| 国产精品久久一级| 久久精品一区二区三区四区| 91精品国产综合久久久久久| 欧美视频一区二|