Database/SQL Server

MS SQL - 인덱스 뷰 Indexed View

청렴결백한 만능 재주꾼 2020. 12. 5. 02:37
반응형

기본 표준 뷰(인덱스가 안된)는 그냥 쿼리에만 존재한다. 뷰에서 데이터를 불러오려고 할 때에 데이터는 뷰가 기반한 테이블에서 불러져 온다. 

 

그러니 뷰는 기본적으로 가상테이블과 같고 data를 가지지 않는다.

 

그러나 인덱스가 뷰에 만들어진다면 그때부터 이야기가 달라진다. 구체화가 되어지고 데이터를 가질 수 있다. 

SQL server에서는 이것을 indexed View라고 하고 

Oracle에서는 Materialized view라고 한다.

 


 

인덱스 뷰 만들기

Create view vWTotalSalesByProduct
with SchemaBinding
as
Select Name,
SUM(INSULL((QuantitySold * UnitPrice), 0)) as TotalSales,
COUNT_BIG(*) as TotalTransactions
from dbo.tblProductSales
join dbo.tblProduct
on dbo.tblProduct.ProductId = dbo.tblProductSales.ProductId
Group by Name

1. 뷰는 스키마 바인딩옵션을 넣어 만들어야 한다.

(The view should be created with SchemaBinding option)

2. SELECT list중에서 집계 함수가 있고 만약 NULL값이 생성될 수 있다면 대체값을 지정해주어야 한다.

(If an Aggregate function in the SELECT LIST, references an expression, and if there is a possibility for that expression to become NULL, then, a replacement value should be specified.)

3. GROUP By가 지정되어 있는 경우 COUNT_BIG(*)이 포함되어야 한다.

(If GROUP BY is specified, the view select list must contain a COUNT_BIG(*) expression)
4. The base tables in the view, should be references with 2 part name.

 

Create Unique Clustered Index UIX_vWTotalSalesByProduct_Name
on vWTotalSalesByProduct (Name)

 


 

 

뷰의 한계

 

1. 뷰는 매개변수를 가질 수 없다. 테이블 값을 리턴하는 함수가 매개변수가 없는 뷰를 대체할 만한 좋은 함수이다.

You cannot pass parameters to a view. Table Valued Functions are an excellent replacement for parameterized views.

 

2. 규칙과 기본 값을 지정할 수 없다.
Rules and Defaults cannot be associated with views.

 

3. ORDER BY 절은 뷰에서 유효하지 않는다.
The ORDER BY clause is invalid in views unless TOp or FOR XML is also specified.

4. 임시 테이블로 뷰를 만들 수 없다.

Views can not be based on temporary tables.

 

반응형