国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

SQL Server 中Inner join 和where的效率差異

瀏覽:139日期:2023-11-01 17:28:41

今天,手頭上正在作的一個項目,在生成報表時,客戶感覺太慢,于是,各處檢查,看可否提示效率。界面上的都改進(jìn)了,提升不大。如是在SQL 語句上下功夫。(我這人比較懶,對簡單的語句和查詢都沒有經(jīng)過仔細(xì)優(yōu)化的,一般只對姚使用left join,outer join,group by 以及carsor的語句會仔細(xì)寫并用數(shù)據(jù)庫理論考慮和檢查---因為這種語句一般測試時如果發(fā)現(xiàn)錯誤,檢查和調(diào)試很麻煩)

先在網(wǎng)上Google搜索“Join 與 Where 效率”以及察看SQL Server 幫助文檔,希望能獲得“捷徑”些的優(yōu)化思路。

搜索的結(jié)果是,各大論壇,包括MSDN上很多人提出了這個問題,但回答是眾說紛紜。總體上總結(jié)出來時說:對小數(shù)據(jù)量(<N萬)的來說效率幾乎無差異,更有說法說Inner join 和Where只是SQL標(biāo)準(zhǔn)不同,在查詢分析器中SQL Server查詢分析器是將Where直接轉(zhuǎn)換為Join后查詢的。

還是自己來做試驗吧。

如是有了如下比較結(jié)果(均在查詢分析器中查詢和計時):

語句(1)declare @operatorName nvarchar(50)set @operatorName = '%'

select distinct item.*; from item , customer_item , customer_operator ,operatorwhere item.itemcode = customer_item.itemCode and customer_item.customerCode =; customer_operator.customerCodeand customer_operator.operatorId =; customer_operator.operatorIdand operator.operatorName like @operatorNameand item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0查詢結(jié)果,74行,共時間0:00:04

語句(2)declare @operatorName nvarchar(50)

set @operatorName = '%'

select distinct item.*; from item inner join; customer_item on; item.itemcode = customer_item.itemCode inner join customer_operator on customer_item.customerCode = customer_operator.customerCodeinner join operator on customer_operator.operatorId = operator.operatorIdwhere; operator.operatorName like @operatorNameand item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0共74行,時間0:00:01

后檢查發(fā)現(xiàn)語句(1)中有一個重復(fù)自查詢條件 :customer_operator.operatorId =; customer_operator.operatorId將其葉加到語句2中,語句(3)declare @operatorName nvarchar(50)

set @operatorName = '%'

select distinct item.*; from item inner join; customer_item on; item.itemcode = customer_item.itemCode inner join customer_operator on customer_item.customerCode = customer_operator.customerCodeinner join operator on customer_operator.operatorId = operator.operatorIdwhere; operator.operatorName like @operatorNameand item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0and customer_operator.operatorId =; customer_operator.operatorId

所用時間和結(jié)果都為74行,時間0:00:01。

將語句(1)中的去掉該條件后成為語句(4)declare @operatorName nvarchar(50)set @operatorName = '%'

select distinct item.*; from item , customer_item , customer_operator ,operatorwhere item.itemcode = customer_item.itemCode and customer_item.customerCode =; customer_operator.customerCode--and customer_operator.operatorId =; customer_operator.operatorIdand operator.operatorName like @operatorNameand item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0

時間和結(jié)果為74行,時間0:00:01。

終于發(fā)現(xiàn)了些他們的差異。

結(jié)論: 盡量使用Join 而不是Where來列出關(guān)聯(lián)條件,特別是多個表聯(lián)合的時候。原因是: (1)在效率上,Where可能具有和Inner join一樣的效率。但基本可以肯定的(通過SQLServer幫助和其它資料,以及本測試)是Join的效率不比Where差。 (2)使用Join可以幫助檢查語句中的無效或者誤寫的關(guān)聯(lián)條件

標(biāo)簽: Sql Server 數(shù)據(jù)庫
主站蜘蛛池模板: 免费人成年短视频在线观看免费网站 | 久久99国产精一区二区三区 | 韩国一级理黄论片 | 欧美激情视频在线观看一区二区三区 | 自拍 欧美 | 手机在线观看毛片 | 国产亚洲精品久久久久久 | 久久精品一区二区免费看 | 欧美在线bdsm调教一区 | 欧美成人免费午夜影视 | 特级做人爱c级特级aav毛片 | 亚洲va老文色欧美黄大片人人 | 久久精品成人免费网站 | 高清免费国产在线观看 | 99精品免费久久久久久久久日本 | 九九九九精品视频在线播放 | 国产乱弄视频在线观看 | 国产精品亚洲专区在线播放 | 在线欧美日韩精品一区二区 | 免费一区二区三区久久 | 久久爱99re| 精品国产免费一区二区三区五区 | 国产91精品久久久久久久 | 成人中文字幕在线观看 | 国产成人免费高清视频 | 国产精品国产三级国产a | 国产欧美成人一区二区三区 | 亚洲精品国产高清不卡在线 | 国产三级在线播放线 | 日本巨乳中文字幕 | 成人看片黄a免费 | 日本加勒比在线视频 | 亚洲国产精品免费观看 | 亚洲综合亚洲综合网成人 | 一区二区三区视频免费观看 | 99精品在线免费观看 | 久久久久久久久一次 | 欧美三级黄 | 日韩 亚洲 制服 欧美 综合 | 久久人人草 | 玖玖精品视频在线 |