<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 154  文章 - 60  trackbacks - 0
    <2008年2月>
    272829303112
    3456789
    10111213141516
    17181920212223
    2425262728291
    2345678

    聲明:

    該blog是為了收集資料,認(rèn)識朋友,學(xué)習(xí)、提高技術(shù),所以本blog的內(nèi)容除非聲明,否則一律為轉(zhuǎn)載!!

    感謝那些公開自己技術(shù)成果的高人們!!!

    支持開源,尊重他人的勞動!!

    常用鏈接

    留言簿(3)

    隨筆分類(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學(xué)習(xí)(技術(shù))

    觀察思考(非技術(shù))

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    SQL數(shù)據(jù)庫使用JOIN的優(yōu)化方法

      很早以前,也是一提到SQL Server,就覺得它的性能沒法跟Oracle相比,一提到大數(shù)據(jù)處理就想到Oracle。自己一路走來,在本地blog上記錄了很多優(yōu)化方面的 post,對的錯的都有,沒有時間系列的整理出來,這篇文章將join方法的概念稍微整理在一起,給大家個參考。通過查資料了解里面提到的各種概念,在實 際中不斷驗證總結(jié),完全可以對數(shù)據(jù)庫一步步深入理解下去的。

      我只對SQL Server 2000比較了解,但這并不阻礙我在Oracle、MySql進(jìn)行SQL調(diào)優(yōu)、產(chǎn)品架構(gòu),因為在數(shù)據(jù)庫理論原理上,各大數(shù)據(jù)庫基本出入不大,對數(shù)據(jù)庫的深入理解,也不會影響你架構(gòu)設(shè)計思想變壞,相反給你帶來的是更深層次的思考。

      關(guān)于執(zhí)行計劃的說明

      在SQL Server查詢分析器的Query菜單中選擇Show Execution Plan,運行SQL查詢語句,在結(jié)果窗口中有Grid、Execution Plan、Messages三個Tab。看圖形形式的執(zhí)行計劃,順序是從右到左,這也是執(zhí)行的順序。執(zhí)行計劃中的每一個圖標(biāo)表示一個操作,每一個操作都會 有一個或多個輸入,也會有一個或多個輸出。輸入和輸出,有可能是一個物理數(shù)據(jù)表、索引數(shù)據(jù)結(jié)構(gòu),或者是執(zhí)行過程中的一些中間結(jié)果集/數(shù)據(jù)結(jié)構(gòu)。鼠標(biāo)移動到 圖標(biāo)上,會顯示這個操作的具體信息,例如邏輯和物理操作名稱、記錄的數(shù)量和大小、I/O成本、CPU成本、操作的具體表達(dá)式(參數(shù)Argument)。鼠 標(biāo)移動到連接箭頭上,會顯示箭頭起始端的操作輸出結(jié)果集的記錄數(shù)、記錄的大小,一般情況下可以將這個輸出結(jié)果集理解為箭頭結(jié)束端的輸入。

      另 外關(guān)于執(zhí)行計劃的一些補(bǔ)充說明:1. 執(zhí)行計劃中顯示的信息,都是一個“評估”的結(jié)果,不是100%準(zhǔn)確的信息,例如記錄數(shù)量是取自統(tǒng)計信息,I/O成本、CPU成本來自執(zhí)行計劃生成過程中基 于統(tǒng)計信息等得出的評估結(jié)果。2. 執(zhí)行計劃不一定準(zhǔn)確,一方面受SQL Server維護(hù)的統(tǒng)計信息準(zhǔn)確性的影響,另一方面SQL語句編譯時刻與執(zhí)行時刻的環(huán)境(內(nèi)存使用狀況、CPU狀況等)可能會不一樣。

      關(guān)于統(tǒng)計信息、I/O成本和CPU成本的評估、SQL語句的編譯和執(zhí)行過程,這里不再深入。另外盡管執(zhí)行計劃不一定準(zhǔn)確,但它仍是SQL語句分析最重要的依據(jù),因為你可以理解為,絕大部分情況下,SQL Server是以這種方式來執(zhí)行的。

      JOIN方法說明

      數(shù)據(jù)庫中,象tableA inner join tableB、tableA left out join tableB這樣的SQL語句是如何執(zhí)行join操作的?就是說SQL Server使用什么算法實現(xiàn)兩個表數(shù)據(jù)的join操作?

      SQL Server 2000有三種方式:nested loop、merge、hash。Oracle也是使用這三種方式,不過Oracle選擇使用nested loop的條件跟SQL Server有點差別,內(nèi)存管理機(jī)制跟SQL Server不一樣,因此查看執(zhí)行計劃,Oracle中nested loop運用非常多,而merge和hash方式相對較少,SQL Server中,merge跟hash方式則是非常普遍。

      以SQL Server 2000為例對這三種方式進(jìn)行說明,穿插在里面講解執(zhí)行計劃的一些初級使用。

      1. nested loop join

      1.1 示例SQL

      select ... from tableA inner join tableB on tableA.col1=tableB.col1 where tableA.col2=? and tableB.col2=?tableA中沒有建立任何索引,tableB中在col1上有建立一個主鍵(聚集索引)。

      1.2 算法偽代碼描述

      foreach rowA in tableA where tableA.col2=?{search rowsB from tableB where tableB.col1=rowA.col1 and tableB.col2=? ;if(rowsB.Count<=0)discard rowA ;elseoutput rowA and rowsB ;}

      join操作有兩個輸入,上面例子中tableA是outer input,用于外層循環(huán);tableB是inner input,用于循環(huán)內(nèi)部。下面針對執(zhí)行計劃描述一下SQL Server完成這個操作的具體步驟。 %. ^ g.L

      2vt [ AhVA

      1.3 查看執(zhí)行計劃方法

      移到文章最前面。

      1.4 執(zhí)行步驟

      下 面是示例SQL的執(zhí)行計劃圖。 nested loop操作的右邊,位于上面的是outer input,位于下面的是inner input。你不能夠根據(jù)join中哪個表出現(xiàn)在前面來確定outer input和inner input關(guān)系,而必須從執(zhí)行計劃中來確定,因為SQL Server會自動選擇哪個作為inner input。

    posted on 2008-02-15 14:02 lk 閱讀(1334) 評論(0)  編輯  收藏 所屬分類: DB
    主站蜘蛛池模板: 无码高潮少妇毛多水多水免费| 最新亚洲成av人免费看| 亚洲xxxx视频| 中文字幕永久免费| 国产日本一线在线观看免费| 相泽亚洲一区中文字幕| 亚洲日本中文字幕区| 亚洲Av无码国产一区二区| 高清一区二区三区免费视频| 免费无码黄动漫在线观看| 亚洲国产精品久久久久网站 | 女人裸身j部免费视频无遮挡| 波多野结衣免费一区视频| 热99re久久精品精品免费| 久久久久亚洲精品无码网址色欲| 成人免费看吃奶视频网站| 精品亚洲成a人在线观看| 曰曰鲁夜夜免费播放视频| 亚洲乱码一二三四区国产| 在线成人精品国产区免费| 婷婷精品国产亚洲AV麻豆不片| 人禽伦免费交视频播放| 免费激情视频网站| 精品一区二区三区无码免费直播| 无人在线直播免费观看| 亚洲精品天堂在线观看| 免费va人成视频网站全| 九九精品国产亚洲AV日韩| vvvv99日韩精品亚洲| 亚洲Av永久无码精品黑人| 亚洲av日韩片在线观看| 国产成人免费ā片在线观看老同学 | 亚洲av无码片vr一区二区三区| 亚洲成aⅴ人片久青草影院| 亚洲国产精品成人午夜在线观看| 国产a视频精品免费观看| 亚洲黄色网址大全| 99精品视频在线观看免费播放| 亚洲精品国产美女久久久| 黄 色一级 成 人网站免费| 亚洲精品视频免费|