1. 程式人生 > >改寫優化SQL(1):標量子查詢改為left join

改寫優化SQL(1):標量子查詢改為left join

標量子查詢就是在select中出現的子查詢,效率相對來說比較低,建議修改為效率更高的left join。

一、建表

CREATE TABLE tb_emp
(
emp_id INT NOT NULL PRIMARY KEY CLUSTERED,
emp_name VARCHAR(20) NOT NULL,
tel VARCHAR(20) null
)

INSERT INTO dbo.tb_emp
VALUES
(1, '張三','1234567890'),
(2, '李四','9876543210'),
(3, '王五','12345'),
(4, '孫六','666666666'),
(5, '半澤直樹','8888888888');


CREATE TABLE tb_org
(
org_id INT NOT NULL PRIMARY KEY CLUSTERED,
org_name VARCHAR(30) NOT NULL,
parent_org_id INT NULL,
emp_id INT NULL
)


INSERT INTO tb_org(org_id,org_name,parent_org_id,emp_id)
VALUES
(1, '行長', NULL,1),
(2, '常務', 1,2),
(3, '專務', 1,3),
(4, '營業二部部長', 3,4),
(5, '營業二部次長', 4,5);

二、標量子查詢寫法
SELECT o.org_id,
       o.org_name,
	   (SELECT emp_name FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_name,
	   (SELECT tel FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_tel
FROM tb_org o
執行計劃:


三、left join寫法

把標量子查詢的寫法,轉成left join:

SELECT o.org_id,
       o.org_name,
	   e.emp_name,
	   e.tel AS emp_tel
FROM tb_org o
LEFT JOIN tb_emp e
ON e.emp_id = o.emp_id

執行計劃:


總結:

從上面的執行計劃看,標量子查詢的寫法,對tb_emp訪問了2次,而改寫為left join的寫法後,執行計劃變得更簡單,對tb_emp只訪問了1次,效率的差異立見分曉。

另外,還有一個問題:雖然sql server的優化器會對sql進行優化,但是並不能把標量子查詢,優化為left join的寫法,因為優化器並不知道編寫sql的人的意圖到底是什麼。

所以還是的大家寫sql時,有意識的,少用標量子查詢,多用join的寫法來實現。

相關推薦

改寫優化SQL1標量查詢left join

標量子查詢就是在select中出現的子查詢,效率相對來說比較低,建議修改為效率更高的left join。 一、建表 CREATE TABLE tb_emp ( emp_id INT NOT NULL PRIMARY KEY CLUSTERED, emp_name VARC

演算法優化1基礎知識-凸集,單峰函式,擬凸函式與凸函式,函式凹凸性定義

本文筆記介紹我最近學習的演算法優化的基礎知識,有: 最優化問題的一般形式 約束問題的分類及形式 優化問題的分類 單峰函式(Unimodal function)的定義 擬凸函式(Quasiconvex function)的定義

sql優化實戰把full joinleft join +union all從5分鐘降10秒

今天收到一個需求,要改寫一個報表的邏輯,當改完之後,再次執行,發現執行超時。 因為特殊原因,無法訪問客戶的伺服器,沒辦法檢視sql的執行計劃、沒辦法知道表中的索引情況,所以,嘗試從語句的改寫上來優化。

SQL Server2016新特性1動態的顯示執行計劃(效果類似小視訊)

SQL Server2016種的一個新特性是 可以動態的顯示 執行計劃的過程,就像小視訊一樣的效果。 一、準備工作 在資料庫有一個表tb,資料量在8000w左右,如果資料量少了,顯示的動態過程會一閃而過。 演示的例子很簡單,就是要計算tb表的準確記錄數,程式碼如下: S

十二Hibernate中的多表操作1單向多對一

art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {

Python學習手冊筆記1Python對象類型

python 在Python中一切皆對象,Python程序可以分解為模塊、語句、表達式及對象。如下所示:1 程序由模塊組成2 模塊包含語句3 語句包含表達式4 表達式建立並處理對象 內置對象(核心類型):1)數字:>>> 2+2 #整數加法4>>&g

Canvas入門1繪制矩形、圓、直線、曲線等基本圖形

dsm etc win cti b2c 創建 例如 .com courier 來源:http://www.ido321.com/968.html 一、Canvas的基礎知識 Canvas是HTML 5中新增的元素,專門用於繪制圖形。canvas元素就相當於一塊“畫布

Pro Android學習筆記 ActionBar1Home圖標區

ces tom 新的 方便 find rac vertica lba manifest ?? Pro Android學習筆記(四八):ActionBar(1):Home圖標區 2013年03月10日 ? 綜合 ? 共 3256字 ? 字號 小 中 大 ? 評論關閉

python每日一類1pathlib

one pre 面向 iss open log python href reg 每天學習一個python的類(大多數都是第三方的),聚沙成金。 -----------------------------------------------------------------

【開源】OSharp框架學習系列1總體設計及系列導航

正是 html 組織 內聚性 權限 是什麽 enc 3-0 分發 OSharp是什麽?   OSharp是個快速開發框架,但不是一個大而全的包羅萬象的框架,嚴格的說,OSharp中什麽都沒有實現。與其他大而全的框架最大的不同點,就是OSharp只做抽象封裝,不做實現。依賴註

uboot命令1mmc命令

當前 .com 設備 十六進制 mci rgs 開發平臺 通過 硬件 版權聲明 更新:2017-06-07博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 今天在進行Android分區

idea1安裝配置

idea idea安裝配置 二、配置2.1、激活Help --> Register...2.2、皮膚及字體File-->Settings...-->2.2.1、皮膚 2.2.2、字體 2.3、git在https://github.com/中註冊一個賬號IDEA還需要Git客戶端,官方

ArcGIS API for JavaScript學習1第一個地圖

樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一

springCloud1微服務簡介

spring cloud 微服務 一、什麽是微服務微服務架構風格是一種將一個單一應用程序開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信采用輕量級通信機制(通常用HTTP資源API)。二、微服務架構特性1、每個微服務可獨立運行在自己的進程裏2、一系列獨立運行的微服務共同構建起整個系

ActiveReports 9實戰教程1 手把手搭建好開發環境Visual Studio 2013 社區版

line tool mmu tin style textbox ble mil nts ActiveReports 9剛剛公布3天。微軟就公布了 Visual Studio Community 2013 開發環境。Visual Studio Community 2013

facets學習1什麽是facets

遺失 air 不同的 無縫切換 over 快速 後來 樣式 觀察 ML 數據集可以包含數億個數據點,每個數據點由數百(甚至數千)的特征組成,幾乎不可能以直觀的方式了解整個數據集。為幫助理解、分析和調試 ML 數據集,谷歌開源了 Facets,一款可視化工具。 Facets

TiDB1 server測試安裝

變量 bst emp fun big monit sub trac 下載代碼 本文的原文連接是: http://blog.csdn.net/freewebsys/article/details/50600352 未經博主同意不得轉載。 博主地址是:h

python函數1初始函數

索引 編程 sed 使用 在一起 用法 lease 括號 .com 在學了前面很多python的基礎類型後,我們終於可以進入下一階段,今天我們將走進一個函數的新世界。 預習: 1、寫函數,計算傳入字符串中【數字】、【字母】、【空格] 以及 【其他】的個數 2、寫函數,判

C++學習1最大子段和多種解法

多少 問題: code namespace 數據 組成 amp using () 問題:給定由n個數(可能為負數)組成的序列a1,a2,a3,...,an,求該序列子段和的最大值。 第一種解法:(最容易考慮的方法,將所有的子段一一相加,然後比較) 1 #include&

每天一個linux命令1scp 命令

filename use des 本地文件 lin oca www tro 服務器 scp命令主要用於兩個服務器之間文件的傳輸。 1、從服務器下載文件 scp [email protected]:/path/filename /tmp/local_destin