日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL JOIN --Merge Join

發(fā)布時(shí)間:2025/3/17 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL JOIN --Merge Join 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1概述
Merge join 合并連接。兩個(gè)集合進(jìn)行merge join,需要有一個(gè)等值的條件,然后需要兩個(gè)已排序好的集合。

2 one-to-many與many-to-many
2.1 One-to-many
當(dāng)參與merge join的兩個(gè)集合中,其中一個(gè)集合在等值條件上是具有唯一性(如SELECT * FROM T1 INNER JOIN T2 ON T1.A=T2.B,如果T1在A列上具有唯一性),那么即為one-to-many。主要步驟為:首先從兩個(gè)集合中各取出一條記錄進(jìn)行比較,如果符合join條件,那么取出該行;否則將值小記錄從集合中移除,然后取值小集合的下一行,繼續(xù)比較。
2.2 many-to many
當(dāng)參與merge join的兩個(gè)集合中,沒(méi)有一個(gè)集合在等值條件上具有唯一性時(shí),則采用many-to-many(SELECT * FROM T1 INNER JOIN T2 ON T1.A=T2.B,當(dāng)列A與列B都不具有唯一性)。主要步驟為:在A和B中都存在A1,A2..An,B1,B2..Bn,那么正常情況下需要為A的每一條記錄(A1,A2..An)都要將B中的B1,B2..Bn讀取出來(lái),這樣浪費(fèi)性能。所在數(shù)據(jù)庫(kù)在處理時(shí),將B中的匹配行儲(chǔ)存在tempdb中,如果A中的下一行相等,則讀取tempdb中的內(nèi)容,否則刪除tempdb中的數(shù)據(jù)。
2.3 one-to-many與many-to-many的比較
很顯然,one-to-many的效率更高,因?yàn)樗恍枰R時(shí)表。那么如何讓查詢優(yōu)化器知道我們其中某個(gè)集合具有唯一性呢。方法一是:建立聚集索引;二是如distinct、group by操作符。

3排序與索引
數(shù)據(jù)庫(kù)幾個(gè)大的操作之一就是大表的排序,所以使用merge join如果表數(shù)據(jù)量比較大,并且無(wú)索引,那么并不適合merge join。所以當(dāng)數(shù)據(jù)量很大,就需要為其添加索引。

4示例
測(cè)試數(shù)據(jù)

View Code IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GoodsType]')) DROP TABLE [dbo].[GoodsType] GO --商品類型表 CREATE TABLE dbo.[GoodsType] (id int,good_type_name nvarchar(50) );INSERT INTO dbo.GoodsType SELECT 1,'服裝' UNION ALL SELECT 2,'數(shù)碼' UNION ALL SELECT 3,'家電'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Goods]')) DROP TABLE [dbo].[Goods] GO --商品類型表 CREATE TABLE dbo.[Goods] (id int,good_name nvarchar(50),good_type int );INSERT INTO dbo.Goods SELECT 1,'ADT恤',1 UNION ALL SELECT 2,'AD外套',1 UNION ALL SELECT 3,'T002電視',2 UNION ALL SELECT 4,'海爾洗衣機(jī)',2 UNION ALL SELECT 5,'HP222',3

4.1
未建任何索引,執(zhí)行SQL

View Code SET STATISTICS PROFILE ON SELECT * FROM Goods AS GINNER JOIN GoodsType AS GT ON G.good_type=GT.id OPTION(MERGE JOIN)

結(jié)果:

說(shuō)明
1>未建立索引時(shí),需要為兩個(gè)集合進(jìn)行排序;
2>雖然在連接條件上唯一,但是未建唯一聚集索引時(shí),為多對(duì)多的連接;

4.2
建立非聚集索引,執(zhí)行SQL

View Code CREATE CLUSTERED INDEX GT ON GOODSTYPE(ID) CREATE CLUSTERED INDEX G ON GOODS(good_type)SET STATISTICS PROFILE ON SELECT * FROM Goods AS GINNER JOIN GoodsType AS GT ON G.good_type=GT.id OPTION(MERGE JOIN)

結(jié)果:

說(shuō)明:
1>建立索引后,執(zhí)行merge join無(wú)排序的開(kāi)銷
2>雖然兩個(gè)集合都建立了索引,并且連接的關(guān)鍵字也無(wú)重復(fù),但還是多對(duì)多的連接,因?yàn)閮?yōu)化器不知道它是唯一的。

4.3
為其中一個(gè)集合建立唯一聚集索引,執(zhí)行SQL

View Code DROP INDEX GT ON GOODSTYPE CREATE UNIQUE CLUSTERED INDEX GUT ON GOODSTYPE(ID)SET STATISTICS PROFILE ON SELECT * FROM Goods AS GINNER JOIN GoodsType AS GT ON G.good_type=GT.id OPTION(MERGE JOIN)

結(jié)果

說(shuō)明:
1>為其中的一個(gè)集合建立唯一聚集索引時(shí),此時(shí)的連接為一對(duì)一的連接(執(zhí)行計(jì)劃中無(wú)一對(duì)一連接的概念)

5總結(jié)
當(dāng)不適合使用nested join時(shí),可以考慮使用merge join。在使用merge join時(shí),需要注意兩個(gè)概念:一是排序,最好是索引排序,否則大數(shù)據(jù)量的實(shí)時(shí)排序會(huì)增加太多的成本;二是連接方式,是一對(duì)多還是多對(duì)多,如果關(guān)鍵字不重復(fù),可以建立唯一聚集索引,即盡量使用一對(duì)多的連接。

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的SQL JOIN --Merge Join的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。