[MSSQL][Performance] 透過檢視表 SELECT 是否會變慢?

[SQL][Performance] 透過檢視表 SELECT 是否會變慢?

心裡一直有個疑思,如果我透過檢視表去 SELECT 資料表,和我直接 SELECT 資料表的結果,效能上是否會有差別?


-- =============================================
-- Author: Henry
-- Author URL: http://www.dotblogs.com.tw/henryli/
-- Script Version: 1.0
-- MSSQL Version: 2005+
-- Create date: 2014-06-12
-- Update date: 2014-06-12
-- Description:	測試 ( 透過檢視表 SELECT 資料表 ) 和 ( 直接 SELECT 資料表 ) 的效能差異
-- Require: none
-- =============================================
IF OBJECT_ID('T') IS NOT NULL
	DROP TABLE T;
GO
IF OBJECT_ID('V') IS NOT NULL
	DROP VIEW V;
GO
--建立資料表
CREATE TABLE T 
(
	B INT IDENTITY(1,1)
	, C DATETIME2
	, D DATETIME2 DEFAULT(GETDATE())
	, E DATETIME2 DEFAULT(GETDATE()));
GO
--建立檢視表
CREATE VIEW V
AS
	SELECT * FROM T
GO
--寫入測試資料
INSERT INTO T (C) VALUES (GETDATE());
GO 1000

--比較
SELECT B, C FROM T
GO
SELECT B, C FROM V
GO

 

執行結果:一樣

image

 

UNION ALL ,多張 TABLE,只取部分欄位的效能差異呢?


-- =============================================
-- Author: Henry
-- Author URL: http://www.dotblogs.com.tw/henryli/
-- Script Version: 1.0
-- MSSQL Version: 2005+
-- Create date: 2014-06-12
-- Update date: 2014-06-12
-- Description:	測試 ( 透過檢視表 SELECT UNION ALL 資料表 ) 和 ( 直接 SELECT UNION ALL 資料表 ) 的效能差異
-- Require: none
-- =============================================
IF OBJECT_ID('T2') IS NOT NULL
	DROP TABLE T2;
GO
IF OBJECT_ID('T3') IS NOT NULL
	DROP TABLE T2;
GO
IF OBJECT_ID('V2') IS NOT NULL
	DROP VIEW V2;
GO
--建立資料表
CREATE TABLE T2 
(
	B INT IDENTITY(1,1)
	, C DATETIME2
	, D DATETIME2 DEFAULT(GETDATE())
	, E DATETIME2 DEFAULT(GETDATE()));
GO
CREATE TABLE T3 
(
	B INT IDENTITY(1,1)
	, C DATETIME2
	, D DATETIME2 DEFAULT(GETDATE())
	, E DATETIME2 DEFAULT(GETDATE()));
GO
--建立檢視表
CREATE VIEW V2
AS
	SELECT * FROM T2
	UNION ALL
	SELECT * FROM T3
GO
--寫入測試資料
INSERT INTO T2 (C) VALUES (GETDATE());
GO 1000
--寫入測試資料
INSERT INTO T3 (C) VALUES (GETDATE());
GO 1000


--比較
SELECT B, C FROM T2
UNION ALL
SELECT B, C FROM T3
GO
SELECT B, C FROM V2
GO

 

執行結果:一樣

image

 

查看實體 TABLE 的讀取,只會針對 SELECT 檢視表所需的欄位做輸出,而非檢視表定義的 SELECT * 。

image

 

結論:透過檢視表,即使檢視表是 SELECT * ,只要 SELECT 檢視表時,是 SELECT 部分欄位,執行計畫並不會依照檢視表 SELECT 出所有欄位,而是依照所需欄位去讀取。

 

創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權,文章歡迎轉載,請註明出處,謝謝~~~