亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

update 子查詢使用介紹

2024-08-31 01:02:26
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了update 子查詢使用介紹,需要的朋友可以參考下
 
 

基礎知識 
1, 關聯子查詢和非關聯子查詢

在非關聯子查詢中,內部查詢只執行一次并返回它的值給外部查詢,然后外部查詢在它的處理中使用內部查詢返回給它的值。而在關聯子查詢中,對于外部查詢返回的每一行數據,內部查詢都要執行一次。另外,在關聯子查詢中是信息流是雙向的。外部查詢的每行數據傳遞一個值給子查詢,然后子查詢為每一行數據執行一次并返回它的記錄。然后,外部查詢根據返回的記錄做出決策。

如:

SELECT o1.CustomerID, o1.OrderID, o1.OrderDateFROM Orders o1WHERE o1.OrderDate = (SELECT Max(OrderDate)FROM Orders o2WHERE o2.CustomerID = o1.CustomerID)
FROM Orders o2WHERE o2.CustomerID = o1.CustomerID)ORDER BY CustomerID

是一個非關聯子查詢

2, 提示(HINT)

一般在優化時,無論采用基于規則的或是基于代價的方法,由Oracle系統的優化器來決定語句的執行路徑。這樣的選擇的路徑不要見得是最好的。所以,Oracle提供了一種方法叫提示的方法。它可以讓編程人員按照自己的要求來選擇執行路徑,即提示優化器該按照什么樣的執行規則來執行當前的語句。這樣可以在性能上比起Oracle優化自主決定要好些。

通常情況下,編程人員可以利用提示來進行優化決策。通過運用提示可以對下面內容進行指定:


l SQL語句的優化方法;

l 對于某條SQL語句,基于開銷優化程序的目標;

l SQL語句訪問的訪問路徑;
l 連接語句的連接次序;
l 連接語句中的連接操作。

如果希望優化器按照編程人員的要求執行,則要在語句中給出提示。提示的有效范圍有限制,即有提示的語句塊才能按照提示要求執行。下面語句可以指定提示:

l 簡單的SELECT ,UPDATE ,DELETE 語句;
l 復合的主語句或子查詢語句;
l 組成查詢(UNION)的一部分。

提示的指定有原來的注釋語句在加“+”構成。語法如下:

[ SELECT | DELETE|UPDATE ] /*+ [hint | text ] */

[ SELECT | DELETE|UPDATE ] --+ [hint | text ]

注意在“/*”后不要空就直接加“+”,同樣 “--+”也是連著寫。

警告:如果該提示語句書寫不正確,則Oracle就忽略掉該語句。

常見的提示有:

Ordered 強制按照from子句中指定的表的順序進行連接
Use_NL 強制指定兩個表間的連接方式為嵌套循環(Nested Loops)
Use_Hash 強制指定兩個表間的連接方式為哈希連接(Hash Join)
Use_Merge 強制指定兩個表間的連接方式為合并排序連接(Merge Join)
Push_Subq 讓非關聯子查詢提前執行
Index 強制使用某個索引

3, 執行計劃

在PL/SQL Developer的SQL WINDOWS中用鼠標或鍵盤選中SQL語句,然后按F5,就會出現執行計劃解析的界面:

4, Update的特點

Update的系統內部執行情況可以參照附文:對update事務的內部分析.doc

使用Update的基本要點就是,

1) 盡量使用更新表上的索引,減少不必要的更新
2) 更新的數據來源花費時間盡可能短,如果無法做到就把更新內容插入到中間表中,然后給中間表建上索引,再來更新
3) 如果更新的是主鍵,建議刪除再插入。
5, 示例用表

后面的闡述將圍繞以下兩張表展開:

Create table tab1 (workdate varchar2(8), cino varchar2(15), val1 number, val2 number);
Create table tab2 (workdate varchar2(8), cino varchar2(15), val1 number, val2 number);
Create table tab3 (workdate varchar2(8), cino varchar2(15), val1 number, val2 number);
Create table tab4 (workdate varchar2(8), cino varchar2(15), val1 number, val2 number);

workdate, cino為兩張表的關鍵字,默認情況沒有建主鍵索引。

二,Update兩種情況

用Update更新某個表,無外乎是兩種情況:根據關聯子查詢,更新字段;通過非關聯子查詢,限定更新范圍。如果還有第三種情況,那就是前兩種情況的疊加。

1, 根據關聯子查詢,更新字段

Update tab1 tSet (val1, val2) = (select val1, val2from tab2where workdate = t.workdateand cino = t.cino);

通過tab2來更新tab1的相應字段。執行SQL語句時,系統會從tab1中一行一行讀記錄,然后再通過關聯子查詢,找到相應的字段來更新。關聯子查詢能否通過tab1的條件快速的查找到對應記錄,是優化能否實現的必要條件。所以一般都要求在tab2上建有Unique或者排重性較高的Normal索引。執行所用時間大概為(查詢tab1中一條記錄所用的時間 + 在tab2中查詢一條記錄所用的時間)* tab1中的記錄條數。

如果子查詢條件比較復雜,如以下語句:

Update tab1 tSet (val1, val2) = (select val1, val2from tab2 ttwhere exists (select 1from tab3where workdate = tt.workdateand cino = tt.cino)and workdate = t.workdateand cino = t.cino);

這時更新tab1中的每條記錄花費在子查詢上的時間將成倍增加,如果tab1中的記錄數較多,這種更新語句幾乎是不可完成。

解決方式是,把子查詢提取出來,做到中間表中,然后給中間表建上索引,用中間表來代替子查詢,這樣速度就能大大提高:

Insert into tab4select workdate, cino, val1, val2from tab2 ttwhere exists (select 1from tab3where workdate = tt.workdateand cino = tt.cino);create index tab4_ind01 on tab4(workdate, cino);Update tab1 tSet (val1, val2) = (select val1, val2from tab4 ttwhere workdate = t.workdateand cino = t.cino);

2, 通過非關聯子查詢,限定更新范圍

Update tab1 tset val1 = 1where (workdate, cino) in (select workdate, cino from tab2)

根據tab2提供的數據范圍,來更新tab1中的相應記錄的val1字段。

在這種情況下,系統默認執行方式往往是先執行select workdate, cino from tab2子查詢,在系統中形成系統視圖,然后在tab1中選取一條記錄,查詢系統視圖中是否存在相應的workdate, cino組合,如果存在,則更新tab1,如果不存在,則選取下一條記錄。這種方式的查詢時間大致等于:子查詢查詢時間 + (在tab1中選取一條記錄的時間 + 在系統視圖中全表掃描尋找一條記錄時間)* tab1的記錄條數。其中“在系統視圖中全表掃描尋找一條記錄時間”會根據tab2的大小而有所不同。若tab2記錄數較小,系統可以直接把表讀到系統區中;若tab2記錄數多,系統無法形成系統視圖,這時會每一次更新動作,就把子查詢做一次,速度會非常的慢。

針對這種情況的優化有兩種

1) 在tab1上的workdate, cino字段上加入索引,同時增加提示。

修改以后的SQL語句如下:

Update /*+ordered use_nl(sys, t)*/ tab1 tset val1 = 1where (workdate, cino) in (select workdate, cino from tab2)

其中sys表示系統視圖。如果不加入ordered提示,系統將會默認以tab1表作為驅動表,這時就要對tab1作全表掃描。加入提示后,使用系統視圖,即select workdate, cino from tab2,作為驅動表,在正常情況下,速度能提高很多。

2) 在tab2表上的workdate, cino字段加入索引,同時改寫SQL語句:

Update tab1 tset val1 = 1where exists (select 1from tab2where workdate = t.workdateand cino = t.cino)

三,索引問題

update索引的使用比較特殊,有時看起來能用全索引,但實際上卻只用到一部分,所以建議把復合索引的各字段寫在一起。

例如:

Update /*+ordered use_nl(sys, t)*/ tab1 tset val1 = 1where cino in (select cino from tab2)and workdate = '200506'

這條SQL語句是不能完全用到tab1上的復合索引workdate + cino的。能用到的只是workdate='200506'的約束。

如果寫成這樣,就沒問題:

Update /*+ordered use_nl(sys, t)*/ tab1 tset val1 = 1where (workdate, cino) in (select workdate, cino from tab2)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黑人性视频| 国内精品久久影院| 97香蕉超级碰碰久久免费软件| 精品久久久久久久久久久久| 欧美日韩国产中字| 日本最新高清不卡中文字幕| 亚洲bt欧美bt日本bt| 日韩va亚洲va欧洲va国产| 2020欧美日韩在线视频| 国产成人av网| 亚洲国产第一页| 亚洲成人精品久久| 欧美性猛交xxxx免费看| 91成人福利在线| 欧美综合国产精品久久丁香| 欧美区在线播放| 亚洲成人xxx| 国产精品丝袜一区二区三区| 在线视频欧美日韩| 精品久久久久久久久久久| 国产精品国产自产拍高清av水多| 欧美精品第一页在线播放| 亚洲欧洲高清在线| 黄色91在线观看| 亚洲成人网在线观看| 久久久久久久久久国产精品| 成人欧美一区二区三区黑人孕妇| 亚洲第一视频网| 日韩美女视频免费在线观看| 亚洲第一中文字幕在线观看| 国产精品扒开腿做爽爽爽男男| 26uuu另类亚洲欧美日本一| 中文字幕av一区二区三区谷原希美| 欧美成人免费网| 国产精品久久久久久中文字| 日韩人体视频一二区| 国产精品日日摸夜夜添夜夜av| 日韩av在线天堂网| 91久久久久久国产精品| 亚洲自拍欧美色图| 欧美激情视频免费观看| 亚洲人成五月天| 欧美另类交人妖| 亚洲欧美日韩爽爽影院| 欧美在线亚洲在线| 精品网站999www| 69国产精品成人在线播放| 日韩激情av在线播放| 国产视频福利一区| 欧美最猛性xxxxx亚洲精品| 96sao精品视频在线观看| 激情亚洲一区二区三区四区| 亚洲成人久久一区| 国产精品久久久久久av下载红粉| 亚洲人成在线电影| 日韩av网站导航| 性欧美亚洲xxxx乳在线观看| 亚洲人成77777在线观看网| 精品久久久久久久久久久| 欧美精品免费在线| 国产成人精品优优av| 美女啪啪无遮挡免费久久网站| 欧日韩不卡在线视频| 91精品久久久久| 亚洲欧美日韩成人| 国产精品一区av| 国产精品主播视频| 国内精品久久久久影院优| 欧美色播在线播放| 日韩欧美亚洲国产一区| 欧美综合第一页| 欧美午夜精品久久久久久浪潮| 日韩在线中文视频| 成人xxxxx| 久久久免费在线观看| 日韩成人在线网站| 成人美女免费网站视频| 中文字幕亚洲一区二区三区五十路| 91国产一区在线| 日韩在线观看av| 国产精品白丝av嫩草影院| 色av吧综合网| 欧美日韩国内自拍| 欧美高清在线观看| 国产日本欧美在线观看| 久久成人综合视频| 久久精品一本久久99精品| 亚洲欧美制服另类日韩| 深夜福利日韩在线看| 日韩欧美a级成人黄色| 不卡av在线网站| 日韩麻豆第一页| 日韩欧美在线第一页| 97视频在线观看免费高清完整版在线观看| 欧美性猛交xxxx黑人猛交| 国产日韩欧美在线播放| 亚洲少妇激情视频| 国产精品免费小视频| 国产精品成av人在线视午夜片| 成人免费视频在线观看超级碰| 清纯唯美日韩制服另类| 日韩欧美一区二区三区久久| 日本精品久久久久久久| 影音先锋欧美精品| zzijzzij亚洲日本成熟少妇| 成人欧美一区二区三区黑人| 欧美超级免费视 在线| 国产精品白丝jk喷水视频一区| 久久成人精品一区二区三区| 最近更新的2019中文字幕| 欧美午夜片欧美片在线观看| 午夜精品福利视频| 日本精品久久久久久久| 91久久久在线| 久久久亚洲欧洲日产国码aⅴ| 中文字幕亚洲精品| 亚洲人精选亚洲人成在线| 欧美精品福利视频| 亚洲综合在线中文字幕| 欧美又大粗又爽又黄大片视频| 欧美日韩成人免费| 国产免费一区二区三区在线观看| 亚洲成色777777在线观看影院| 日韩在线观看免费全| 亚洲亚裔videos黑人hd| xxxxx91麻豆| 国产剧情日韩欧美| 日韩欧美成人精品| 91在线观看免费| 51午夜精品视频| 亚洲成人性视频| 成人黄色在线免费| 欧美成人免费观看| 欧美国产日本高清在线| 欧美夫妻性生活视频| 亚洲国内高清视频| 亚洲国产成人久久综合| 亚洲国产成人一区| 亚洲97在线观看| 欧美亚洲午夜视频在线观看| 久久亚洲国产精品| 国产日韩专区在线| 色偷偷噜噜噜亚洲男人的天堂| 欧美黑人xxxⅹ高潮交| 亚洲国产精品久久久久秋霞不卡| 日韩av中文字幕在线播放| 久久色精品视频| 欧美性生交xxxxxdddd| 91在线免费看网站| 亚洲久久久久久久久久| 国产精品成人一区二区| 亚洲情综合五月天| 欧美床上激情在线观看| 狠狠躁夜夜躁久久躁别揉| 成人久久18免费网站图片| 国产91九色视频| 成人av电影天堂| 亚洲欧美日韩国产精品| 国产欧美一区二区三区视频| 欧美人成在线视频| 高清欧美性猛交xxxx| 亚洲国产精品va在看黑人| 国产91ⅴ在线精品免费观看| 98精品在线视频|