亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL Server優(yōu)化器特性-隱式謂詞

系統(tǒng) 2562 0
原文: SQL Server優(yōu)化器特性-隱式謂詞

我們都知道,一條SQL語(yǔ)句提交給優(yōu)化器會(huì)產(chǎn)生相應(yīng)的執(zhí)行計(jì)劃然后執(zhí)行輸出結(jié)果,但他的執(zhí)行計(jì)劃是如何產(chǎn)生的呢?這可能是關(guān)系型數(shù)據(jù)庫(kù)最復(fù)雜的部分了.這里我為大家介紹一個(gè)有關(guān)SQL Server優(yōu)化器的特性-隱式謂詞,并簡(jiǎn)單介紹在此特性下如何根據(jù)場(chǎng)景控制優(yōu)化器的行為.

?? 在這里我通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)給大家說(shuō)明下.

code

      
        CREATE
      
      
        TABLE
      
       T1 (A 
      
        INT
      
      , B 
      
        INT
      
      
        )


      
      
        CREATE
      
      
        TABLE
      
       T2 (A 
      
        INT
      
      , B 
      
        INT
      
      
        )




      
      
        set
      
       showplan_text 
      
        on
      
      
        SELECT
      
      
        *
      
      
        FROM
      
       T1 
      
        INNER
      
      
        JOIN
      
       T2 
      
        ON
      
       T1.A 
      
        =
      
      
         T2.A




      
    

可以看出我的語(yǔ)句執(zhí)行計(jì)劃中優(yōu)化器為我添加了T2.A=0這個(gè)謂詞.如圖1-1

??????????????????????????????????????????????????????????????? 圖1-1

優(yōu)化器根據(jù)語(yǔ)義邏輯判斷,在不改變結(jié)果集的前提下認(rèn)為提前在T2表中過(guò)濾出T2.A=0的結(jié)果集再參與下面運(yùn)算可以提升效率,這樣在未征得我們同意的情況下他就這樣做了:)

這就是 隱式謂詞

既然這是SQL Server優(yōu)化器的默認(rèn)行為,那在我們自己要控制優(yōu)化器行為的時(shí)候就少不了與其默認(rèn)行為沖突.這里還是通過(guò)簡(jiǎn)單的實(shí)例說(shuō)明.

code

?

      
        select
      
      
        @@VERSION
      
      
        SELECT
      
      
        *
      
      
        FROM
      
       T1 
      
        inner
      
       hash 
      
        JOIN
      
       T2 
      
        ON
      
       T1.A 
      
        =
      
      
         T2.A


      
      
        WHERE
      
       T1.A 
      
        =
      
      
        0
      
    

可以看到,我為sql加了個(gè)hash join的hint結(jié)果就出現(xiàn)了錯(cuò)誤.如圖1-2

?

??????????????????????????????????????????????????????? 圖1-2

原因: 默認(rèn)的情況下優(yōu)化器為我們加上了T2.A=0,t1,t2采用了相同的過(guò)濾條件,這時(shí)T1.A=T2.A自身的意義就不存在了,而hash join自身又需要等值鏈接(equijoin),此時(shí)報(bào)錯(cuò)就出現(xiàn)了.

延伸: 其實(shí)在此種情況下select中檢索湊到一起就可以了,拋錯(cuò)誤讓開(kāi)發(fā)人員郁悶.微軟注意到了這點(diǎn),SQL2012中上述查詢就沒(méi)有問(wèn)題了.如圖1-3

?

??????????????????????????????????????? 圖1-3

問(wèn)題來(lái)了(不是挖掘機(jī)哪家強(qiáng)),如果我用了hint這種情況又該怎么辦呢?就我們剛才的語(yǔ)句分析,hash join需要等值鏈接,可以根據(jù)表的定義規(guī)避他的隱式謂詞特性造成的這個(gè)問(wèn)題.

Where 條件中換成不等值不就可以了:)

Code

      
        SELECT
      
      
        *
      
      
        FROM
      
       T1 
      
        inner
      
       hash 
      
        JOIN
      
       T2 
      
        ON
      
       T1.A 
      
        =
      
      
         T2.A


      
      
        WHERE
      
       T1.A 
      
        >-
      
      
        1
      
      
        and
      
       t1.A
      
        <=
      
      
        0
      
    

?

關(guān)于性能

可以看出在參與JOIN操作之前,優(yōu)化器為我們過(guò)濾掉一部分?jǐn)?shù)據(jù),使得Join的消耗減輕,這是件好事兒,但凡事都有兩個(gè)方面,為過(guò)濾掉的這部分?jǐn)?shù)據(jù)他不是免費(fèi)的,有時(shí)候可能會(huì)加重負(fù)擔(dān).

這里介紹一個(gè) trace flag 2324 ,他可以使優(yōu)化器不采取隱式謂詞行為,在特殊的場(chǎng)景下可以讓我們的執(zhí)行計(jì)劃發(fā)揮的更好.

這里我通過(guò)一個(gè)簡(jiǎn)單的實(shí)例說(shuō)明下.

code

      
        select
      
      
        *
      
      
        from
      
       aaa 
      
        inner
      
      
        join
      
      
         bbb 


      
      
        on
      
       aaa.ProductID
      
        =
      
      
        bbb.ProductID


      
      
        where
      
       aaa.ProductID
      
        >
      
      
        1000
      
      
        and
      
       aaa.ProductID
      
        <
      
      
        1500
      
      
        go
      
      
        select
      
      
        *
      
      
        from
      
       aaa 
      
        inner
      
      
        join
      
      
         bbb 


      
      
        on
      
       aaa.ProductID
      
        =
      
      
        bbb.ProductID


      
      
        where
      
       aaa.ProductID
      
        >
      
      
        1000
      
      
        and
      
       aaa.ProductID
      
        <
      
      
        1500
      
      
        option
      
      (querytraceon 
      
        2324
      
      )
      
        --
      
      
        --禁用隱性謂詞
      
    

可以看到由于由于隱式謂詞在特殊的場(chǎng)景中(如數(shù)據(jù)分布比較傾斜.實(shí)例中ProductID=1001站了bbb表中的80%數(shù)據(jù))過(guò)濾后的join反而不如整體數(shù)據(jù)參加join來(lái)得更快.如圖1-4

?

????????????????????????????????????????????????????????????????????? 圖1-4

此處實(shí)例只為簡(jiǎn)單說(shuō)明作用,實(shí)際生產(chǎn)中可能因?yàn)榻y(tǒng)計(jì)信息問(wèn)題使得優(yōu)化器采用了不合理的運(yùn)算符(如對(duì)bbb中采用seek,則消耗巨大,而統(tǒng)計(jì)信息自身又不易更新)使得執(zhí)行計(jì)劃不合理影響整體性能.感興趣的朋友可以自行測(cè)試.

注:TF2324只對(duì)不等值謂詞起作用.等值謂詞如果想規(guī)避隱性謂詞,參考挖掘機(jī)的例子:)

結(jié)語(yǔ): 凡事都具有兩面性,隱式謂詞在絕大多數(shù)場(chǎng)景中是個(gè)很好的策略,微軟也在一步步完善.但在優(yōu)化器無(wú)法合理處理時(shí),就需要我們?nèi)藶榻槿?

?

SQL Server優(yōu)化器特性-隱式謂詞


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 91亚色视频在线观看 | 青草青在线免费视频 | 九九99九九在线精品视频 | 99r8这里精品热视频免费看 | 国产高清国内精品福利99久久 | 日韩在线免费视频观看 | 国产福利在线观看 | 狠狠色婷婷丁香六月 | 在线日韩国产 | 国产69精品久久久久777 | 亚洲高清中文字幕一区二区三区 | 毛片女人毛片一级毛片毛片 | 爱情片在线观看 | 香蕉久草在线 | 日日摸日日碰夜夜爽久久 | 日韩a级片视频 | 全部免费特黄特色大片视频 | 欧美综合色网 | 日韩毛片免费线上观看 | 欧美夜夜 | cao美女视频网站在线观看 | 国产做人爱三级视频在线 | 在线视频免费国产成人 | 99热这里只有成人精品国产 | 欧洲黄色毛片 | 一级a性色生活片毛片 | 国产精品视频专区 | 国产a不卡片精品免费观看 国产a高清 | 99热精品久久只有精品30 | 91精品免费国产高清在线 | 99久久免费精品视频 | 热99re久久精品2久久久 | 亚洲国产一区视频 | 欧美夜夜骑 | 国产成人综合亚洲欧洲色就色 | 精品视频亚洲 | 成人久久影院 | 色综合久久88一加勒比 | 日本黄色绿像 | 久久精品无码一区二区三区 | 老司机午夜剧场 |