国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2024-08-31 00:51:28
字體:
來源:轉載
供稿:網友

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


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


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


還是自己來做試驗吧。


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


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

 select distinct item.*  from item , customer_item , customer_operator ,operator
where item.itemcode = customer_item.itemCode
and customer_item.customerCode =  customer_operator.customerCode
and customer_operator.operatorId =  customer_operator.operatorId
and operator.operatorName like @operatorName
and item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0
查詢結果,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.customerCode
inner join operator on customer_operator.operatorId = operator.operatorId
where  operator.operatorName like @operatorName
and item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0
共74行,時間0:00:01


后檢查發現語句(1)中有一個重復自查詢條件 :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.customerCode
inner join operator on customer_operator.operatorId = operator.operatorId
where  operator.operatorName like @operatorName
and item.deleted = 0 and customer_item.deleted = 0 and customer_operator.deleted = 0
and customer_operator.operatorId =  customer_operator.operatorId

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


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

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

時間和結果為74行,時間0:00:01。

 

終于發現了些他們的差異。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵港市| 庆元县| 泗阳县| 乐都县| 丰宁| 宜阳县| 东台市| 东兰县| 呼图壁县| 文成县| 沁源县| 龙口市| 承德县| 资源县| 平武县| 陕西省| 仁寿县| 玉林市| 同心县| 禄丰县| 监利县| 怀远县| 渑池县| 彩票| 西乌珠穆沁旗| 镶黄旗| 贞丰县| 克什克腾旗| 高尔夫| 两当县| 金山区| 盐城市| 沭阳县| 张掖市| 扎兰屯市| 蒙自县| 乐安县| 达拉特旗| 婺源县| 谷城县| 高要市|