都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

Left Semi Join と Inner Join を試してみた

 昨日はとても寒かったですが、今日は少し寒さも緩みましたね。出張も終わり、東京に戻ります。そしてもちろん.....新幹線で記事を書きます!
f:id:koogucc11:20160302104530j:plain

 今回名古屋出張中に二回も五十五番行きました!
tabelog.com

 ごまタンタンつけ麺美味しいです。ほとんど中毒!これにさらに全部のせが最高です!
f:id:koogucc11:20160228131815j:plain

 ゴマ坦々つけ麺の中毒になった結果、本部長になりましたー。そして.......太りましたーwww しばらくつけ麺は控えよう.....
f:id:koogucc11:20160228131219j:plain

 つけ麺のお話はここまでにして、早速試してみましょう。いつもの AdventureWorksデータベースを使用します。下記のクエリを SQL Server Management Studio で実行しましょう。

SELECT 
    *
FROM 
    Sales.SalesOrderHeader soh
WHERE 
    soh.SalesOrderID BETWEEN 43870 AND 53610 AND
    soh.SalesPersonID IN ( SELECT 
                               BusinessEntityID 
                           FROM 
                               Person.Person 
                           WHERE 
                               PersonType = 'SP' )

f:id:koogucc11:20160301073419p:plain
※実行プランは下図の通り。
f:id:koogucc11:20160301073429p:plain

 結合処理が Left Semi Join となっています。Left Semi Join は、実行プランの上部の入力の中に下部の入力に一致する行がある場合に該当する行を返します。次に、下記のクエリを SQL Server Management Studio で実行しましょう。

SELECT
    *
FROM 
    Sales.SalesOrderHeader soh
    INNER JOIN ( SELECT 
                     BusinessEntityID 
                 FROM 
                     Person.Person 
                 WHERE 
                     PersonType = 'SP') p ON
    soh.SalesPersonID = p.BusinessEntityID
WHERE 
    SalesOrderID BETWEEN 43870 AND 53610

f:id:koogucc11:20160301073730p:plain
※実行プランは下図の通り。
f:id:koogucc11:20160301073750p:plain
 
 結合処理が Inner Join となっています。Inner Join は、実行プランの上部の入力と下部の入力の結合に適合する各行を返します。 運用環境で試してみましたが、Inner Join のほうが高速ですね。処理内容からしてそんなもんでしょう。あと、Anti Semi Join は、下記のようなクエリの場合に発生します。( NOT IN など)

SELECT 
    *
FROM 
    Sales.SalesOrderHeader soh
WHERE 
    soh.SalesOrderID BETWEEN 43870 AND 53610 AND
    soh.SalesPersonID NOT IN ( SELECT 
                                   BusinessEntityID 
                               FROM 
                                   Person.Person 
                               WHERE 
                                   PersonType = 'SP' )

 オペレータの種類はまだまだたくさんありますが、まだまだ理解していないものも多いです。勉強あるのみですね。

もう春。キャンプの準備。ユニフレーム購入するか♪色々とそろえたくなります。

ユニフレーム(UNIFLAME) UF IRORI EXT 683170

ユニフレーム(UNIFLAME) UF IRORI EXT 683170

ユニフレーム(UNIFLAME) コーヒーバネットcute(キュート) 664025

ユニフレーム(UNIFLAME) コーヒーバネットcute(キュート) 664025

ユニフレーム(UNIFLAME) ミニバーナーUS?700 610183

ユニフレーム(UNIFLAME) ミニバーナーUS?700 610183

ユニフレーム(UNIFLAME) リラックスコット 680261

ユニフレーム(UNIFLAME) リラックスコット 680261

ユニフレーム(UNIFLAME) チャコスタ II665435

ユニフレーム(UNIFLAME) チャコスタ II665435

名古屋の喫茶店に、名古屋めし。名古屋ってカフェが多い気がする。時間があるときに色々探検してみよう!

名古屋めし

名古屋めし

名古屋の喫茶店

名古屋の喫茶店

続・名古屋の喫茶店

続・名古屋の喫茶店