日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看( 二 )


使用并行應(yīng)注意的問題
強(qiáng)制使用并行
Trace flag 8649 在SQL Server中可以不觸發(fā)并行而手動(dòng)指定并行,注意這個(gè)標(biāo)記是無官方文檔記錄,勿輕易使用 。使用時(shí)只需在查詢最好加上query hint:Option(querytraceon 8649)即可 。
數(shù)據(jù)分布不均,預(yù)估,碎片等問題
導(dǎo)致CXPACKET等待以及過多無謂IO,應(yīng)對(duì)方式創(chuàng)建臨時(shí)對(duì)象,更新統(tǒng)計(jì)信息,整理碎片等 。
nested loop Join導(dǎo)致的隨機(jī)IO,及nested loop join預(yù)讀問題等
冷數(shù)據(jù)中使用并行nested join可能導(dǎo)致實(shí)例的IO穩(wěn)定性受影響,面對(duì)具體場(chǎng)景應(yīng)酌情使用 。應(yīng)對(duì)方式可以關(guān)閉nested loop預(yù)讀,而nested loop預(yù)讀時(shí)SQL Server也會(huì)試圖將隨機(jī)IO轉(zhuǎn)化為連續(xù)IO,如具體應(yīng)用合理應(yīng)接受并行nested loop join 。
線程饑餓問題(worker thread starvation)
前面我們說過,線程的授予是按照分支(branches)及并行度授予的,如果并行度高,此時(shí)復(fù)雜的查詢下分支又很多,這個(gè)時(shí)候可能針對(duì)某個(gè)查詢分配過多線程,加之這類查詢又高并發(fā),則這時(shí)出現(xiàn)線程饑餓的幾率就大大增加了 。具體生產(chǎn)中,這個(gè)應(yīng)引起我們的注意 。這里給大家舉個(gè)簡(jiǎn)單的實(shí)例,感興趣的同學(xué)可以自己測(cè)試下 。這個(gè)查詢有5個(gè)分支,分支所申請(qǐng)的線程就是5*16共80個(gè)!如圖5-1:

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看



oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


圖5-1
并行死鎖
并行執(zhí)行提升查詢響應(yīng)時(shí)間,提高用戶體驗(yàn)已經(jīng)被我們所熟知了,但正如我一直強(qiáng)調(diào)的,任何事物均有利弊,我們要做的重點(diǎn)是權(quán)衡 。并行死鎖在并行執(zhí)行中也會(huì)偶爾出現(xiàn),官方給出的解釋是SQL Server的“BUG”,你只需將查詢的MAXDOP調(diào)整為1,死鎖就會(huì)自動(dòng)消失,但有時(shí)我們還應(yīng)追溯其本質(zhì) 。這里用一個(gè)實(shí)例為大家說明下并行死鎖的原因,以便我們更好的利用并行 。
生成測(cè)試數(shù)據(jù)

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


接下來我們執(zhí)行如下語句,取30000下最大偶數(shù),此時(shí)我將執(zhí)行并行數(shù)maxdop隨意調(diào)整為奇數(shù),3,5,7我的執(zhí)行都可以迅速返回結(jié)果 。

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


但當(dāng)我將并行數(shù)調(diào)整為偶數(shù)時(shí),執(zhí)行時(shí)間居然長(zhǎng)達(dá)數(shù)秒…打開trace profiler跟蹤dead lock chain我們發(fā)現(xiàn),當(dāng)并行數(shù)為偶數(shù)時(shí)出現(xiàn)了死鎖 。
注:我們用Trace profiler捕捉死鎖
如圖6-1,6-2,6-3:
oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看



oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


圖6-1

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


圖6-2

oracle數(shù)據(jù)庫菜鳥教程 sqlserver日志查看


圖6-3
有的同學(xué)可能覺得蹊蹺,發(fā)生了什么我們具體分析下并行死鎖的相應(yīng)執(zhí)行計(jì)劃 。
分析:
  • 訪問基表數(shù)據(jù)時(shí)用的是聚集索引掃描,但掃描方式是backward,而SQL server中只有forward scan可以并行掃描,backward只能串行掃描
  • 因此在做exchange向各個(gè)threads分發(fā)數(shù)據(jù)時(shí)(distribute streams)采用roundrobin輪詢分發(fā)數(shù)據(jù),這勢(shì)必造成奇偶數(shù)據(jù)按threads分開流向下一個(gè)過濾操作符
  • 在Filter時(shí)將奇數(shù)的數(shù)據(jù)過濾,而相應(yīng)的threads也就沒有了數(shù)據(jù)
  • 所以在最后exchange匯總數(shù)據(jù)時(shí)(gather streams)有的threads沒有數(shù)據(jù),因而造成死鎖 。
(注:thread 0為主線程,不參與并行分支工作)
分析如圖6-4:

推薦閱讀