搜尋本站文章

顯示具有 SQL Server 2014 Dev 標籤的文章。 顯示所有文章
顯示具有 SQL Server 2014 Dev 標籤的文章。 顯示所有文章

2016-01-29

效能調教:請使用UNION ALL,不用 UNION

以效能觀點,請一律使用 UNION ALL。


先讓我們看看UNION與UNION ALL的說明。


UNION ALL
將所有資料列納入結果中。其中包括複本。若未指定,就會移除資料列複本。
UNION
指定組合多個結果集,以及當做單一結果集傳回。會移除資料列複本。

也就是說,若使用UNION,就會額外耗用系統資源,去逐一比對每一筆資料列!

除非,真的需要耗用系統資源去移除重複的資料列,否則就不該使用UNION。

請參考以下的SQL陳述式:

--EX1. UNION,移除重複項的資料列
SELECT sid, myDate FROM tblUnion01
UNION
SELECT sid, myDate FROM tblUnion02
GO

--EX2. UNION ALL,不移除重複項的資料列
SELECT sid, myDate FROM tblUnion01
UNION ALL
SELECT sid, myDate FROM tblUnion02
GO


我們分別匯入2千筆、20萬筆資料列來做討論:


以兩千筆資料列為例

SQL陳述式
查詢成本(相對於批次)
實驗筆數
UNION
85%
2,000
UNION ALL
15%
2,000

以二十萬筆資料列為例

SQL陳述式
查詢成本(相對於批次)
實驗筆數
UNION
79%
200,000
UNION ALL
21%
200,000

經由上述的測試結果,使用UNION,就會額外耗用系統資源。
再與UNION ALL比較起來,UNION硬是多耗用4倍的系統資源。

也就是說,如果真的需要耗用系統資源去移除重複的資料列,否則就不該使用 UNION。

 分析執行計畫

我們進一步來觀察其所使用的執行計畫:

以兩千筆資料列為例



圖1:執行計畫--兩千筆資料列

在圖1中,觀察使用UNION陳述式的執行計畫,額外多使用「排序(相異排序)」運算子,光這個運算子就耗用了查詢成本(相對於批次)的82%,真是個耗用資源的運算子。


圖2:「排序(相異排序)」運算子

在圖2中,進一步觀察「排序(相異排序)」運算子,可以看到「估計的CPU成本」是:0.0747874,與「估計的I/O成本」:0.0112613來比較,這是極度耗用CPU資源的運算子,兩者相差七倍。

以二十萬筆資料列為例



圖3:執行計畫 -- 二十萬筆資料列

在圖3中,觀察使用UNION陳述式的執行計畫,額外多使用了多個運算子,我們以「雜湊比對(彙總)」運算子來討論:

「雜湊比對(彙總)」運算子


圖4:「雜湊比對(彙總)」運算子

在圖4中,使用「雜湊比對(彙總)」運算子,光這個運算子就耗用了查詢成本(相對於批次)的66%,進一步觀察,可以看到這是完全只使用CPU資源的運算子,沒用到任何I/O成本。

結論


以效能觀點,請一律使用 UNION ALL。除非,真的需要耗用系統資源去移除重複的資料列,否則就不該使用UNION。




請參考以下的範例程式碼:



-- 建立範例資料表:tblUnion01、tblUnion02,並分別新增20萬筆資料列到其中。
USE tempdb
GO
IF EXISTS(SELECT name FROM sysobjects  WHERE  name = N'tblUnion01' AND type = 'U') 
 DROP TABLE tblUnion01
GO
IF EXISTS(SELECT name FROM sysobjects  WHERE  name = N'tblUnion02' AND type = 'U') 
 DROP TABLE tblUnion02
GO
CREATE TABLE tblUnion01
(sid int,myDate datetime)
GO
CREATE TABLE tblUnion02
(sid int,myDate datetime)
GO
--
SET NOCOUNT ON
GO
DECLARE @CNT INT=1

WHILE @CNT <=200000
BEGIN
 INSERT tblUnion01 VALUES(@CNT, GETDATE());
 INSERT tblUnion02 VALUES(@CNT, GETDATE());

 SET @CNT +=1
END

--
INSERT tblUnion01 VALUES(9999999,GETDATE())

-- 以上是建立資料表






-- 觀察資料表

-- 分別擁有200,000筆資料列
SELECT COUNT(*) FROM tblUnion01; -- 200,001
SELECT COUNT(*) FROM tblUnion02; -- 200,000

--EX1. UNION,移除重複項的資料列
SELECT sid, myDate FROM tblUnion01
UNION
SELECT sid, myDate FROM tblUnion02
GO

--EX2. UNION ALL,不移除重複項的資料列
SELECT sid, myDate FROM tblUnion01
UNION ALL
SELECT sid, myDate FROM tblUnion02
GO




以兩千筆資料列的情境

-- 01_執行計畫_2千筆



-- 02_UNION_成本_0.104821



-- 03_UNION ALL_成本_0.0187726



-- 04_排序_相異排序_成本_0.0860484



以二十萬筆資料列的情境

-- 01_執行計畫_20萬筆



-- 02_UNION_成本_4.96574



-- 03_UNION ALL_1.29249



-- 04_雜湊比對_3.26904



-- 05_平行處理_成本_4.96574





UNION (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms180026(v=sql.120).aspx

2015-12-22

Windows 8, Windows 10 需自行新增「SQL Server 組態管理員」


適用環境:

  1. 作業系統:Windows 8, Windows 8.1, Windows 10
  2. SQL Server 版本:SQL Server 2012、SQL Server 2014 

由於 SQL Server 組態管理員是 Microsoft Management Console 程式的內嵌式管理單元,而不是獨立的程式,因此 SQL Server 組態管理員不會在執行 Windows 8 時做為應用程式出現。

若要開啟 SQL Server 組態管理員,在 [搜尋] 快速鍵的 [應用程式] 下,輸入 SQLServerManager12.msc (適用 SQL Server 2014)、SQLServerManager11.msc (適用 SQL Server 2012) 或 SQLServerManager10.msc (適用 SQL Server 2008),然後按 Enter 鍵。

  • SQL Server 2014 版本,輸入:SQLServerManager12.msc
  • SQL Server 2012 版本,輸入:SQLServerManager11.msc


預設的檔案位置是:

C:\Windows\System32\SQLServerManager12.msc

可以將其釘選到開始畫面。









SQL Server 組態管理員

SQL Server 組態管理員是一個工具,用來管理 SQL Server 的相關服務、設定 SQL Server 所用的網路通訊協定,以及管理 SQL Server 用戶端電腦的網路連接組態。

SQL Server 組態管理員是一個 Microsoft Management Console 嵌入式管理單元,您可以從 [開始] 功能表存取它,也可以將它加入任何其他 Microsoft Management Console 顯示畫面中。

Microsoft Management Console (mmc.exe) 會利用 Windows System32 資料夾中的 SQLServerManager10.msc 檔來開啟 SQL Server 組態管理員。

SQL Server 組態管理員和 SQL Server Management Studio 利用 Window Management Instrumentation (WMI) 來檢視和變更部份伺服器設定。

WMI 提供統一的方式來協助您連結管理 SQL Server 工具所要求之登錄作業的 API 呼叫,在 SQL Server 組態管理員嵌入式管理單元元件的所選 SQL 服務上,它提供了增強的控制和操作功能。



參考資料

SQL Server 組態管理員
https://msdn.microsoft.com/zh-tw/library/ms174212(v=sql.120).aspx

2015-05-19

SQL Server 2014 SP1 重新開放下載

版本:12.0.4100.1
發佈日期:2015/5/14

Microsoft SQL Server 2014 Service Pack 為累計更新,可將所有 SQL Server 2014 版本與服務層級升級為 SP1。
此 Service Pack 包含 SQL Server 2014 RTM Cumulative Update 5 (CU5) 及其之前的更新。

-- 01_SQL Server 2014 SP1 下載網頁




-- 02_SQL Server Blog 官方部落格,公布






在完成安裝的建置作業後,檢查相關的資訊:

檢視相關的版本資訊:


-- 查詢相關的版本資料
SELECT RIGHT(LEFT(@@VERSION,25),4) N'產品版本編號' , 
 SERVERPROPERTY('ProductVersion') N'版本編號',
 SERVERPROPERTY('ProductLevel') N'版本層級',
 SERVERPROPERTY('Edition') N'執行個體產品版本',
 DATABASEPROPERTYEX('master','Version') N'資料庫的內部版本號碼'
--
SELECT @@VERSION N'相關的版本編號、處理器架構、建置日期和作業系統'
GO

-- 03_查詢相關的版本資料



-- 04_伺服器屬性_一般



-- 05_SSMS_版本編號






下載 SQL Server 2014 SP1
http://www.microsoft.com/zh-TW/download/details.aspx?id=46694

SQL Server 2014 SP1 download page
http://go.microsoft.com/fwlink/?LinkID=519065




參考資料

SQL Server 2014 SP1,暫時先下架...日期:2015/04/16
http://sharedderrick.blogspot.tw/2015/04/sql-server-2014-sp120150416.html

SQL Server 2014年累積更新 1
https://support.microsoft.com/zh-tw/kb/2931693/zh-tw

2014-12-24

下載 Adventure Works 2014 Sample Databases


網站:Adventure Works 2014 Sample Databases
https://msftdbprodsamples.codeplex.com/releases/view/125550

直接下載檔案:Adventure Works 2014 Full Database Backup.zip
https://msftdbprodsamples.codeplex.com/downloads/get/880661

-- 01_SQL Server Database Product Samples


-- 02_Adventure Works 2014 Sample Databases


-- 03_AdventureWorks2014_資料庫屬性


-- 04_AdventureWorksDW2014_資料庫屬性





參考網址:

Adventure Works 2014 Sample Databases
https://msftdbprodsamples.codeplex.com/releases/view/125550

SQL Server Database Product Samples
http://msftdbprodsamples.codeplex.com/

Microsoft SQL Server Community Projects & Samples
http://sqlserversamples.codeplex.com/

AdventureWorks 與 Northwind 資料表的比較
http://technet.microsoft.com/zh-tw/library/ms124680(v=sql.100).aspx

Visual Studio 2013 如何:安裝範例資料庫
http://msdn.microsoft.com/zh-tw/library/8b6y4c7s.aspx

下載 Northwind 和 pubs 範例資料庫
http://sharedderrick.blogspot.tw/2012/03/northwind-pubs.html

下載與安裝 SQL Server 2012 範例程式,以 Adventure Works 資料庫為例
http://sharedderrick.blogspot.tw/2012/03/sql-server-2012-adventure-works.html

SQL Server 2008 R2 版本的資料庫,無法在 SQL Server 2008 版本上使用;Error 948 The database 'xxx' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.
http://sharedderrick.blogspot.tw/2010/10/sql-server-2008-r2-sql-server-2008.html