간단한 쿼리보다 뷰가 더 빠릅니까?


359

입니다

select *  from myView

같은 결과 집합을 갖기 위해 뷰를 만드는 쿼리 자체보다 빠릅니다.

select * from ([query to create same resultSet as myView])

?

뷰가 일종의 캐싱을 사용하여 간단한 쿼리에 비해 더 빠르다는 것은 완전히 명확하지 않습니다.


7
하나의보기는 확실하지 않지만 중첩 된보기는 전체 성능 지옥입니다.
Muflix 2012

답변:


680

그렇습니다 . 뷰에는 클러스터형 인덱스가 할당 될 수 있으며, 그럴 경우 결과 쿼리 속도를 높일 수있는 임시 결과를 저장합니다.

업데이트 : 적어도 세 사람이 이것에 대해 투표했습니다. 모든 것을 존중하면서, 나는 그들이 틀렸다고 생각합니다. Microsoft의 자체 문서를 통해 Views는 성능을 향상시킬 수 있습니다.

첫째, 간단한보기가 제자리에 확장되어 성능 향상에 직접적으로 기여하지는 않습니다. 그러나 인덱싱 된 뷰는 성능을 크게 향상시킬 수 있습니다 .

문서로 직접 이동하겠습니다.

뷰에 고유 한 클러스터형 인덱스가 생성되면 뷰의 결과 집합이 즉시 구체화되어 데이터베이스의 실제 저장소에 유지되므로 실행 시간에 비용이 많이 드는 작업을 수행하는 오버 헤드가 줄어 듭니다.

둘째, 이러한 인덱싱 된 뷰는 최적화 프로그램이 적절한 경우 테이블 참조 대신 뷰를 사용 하므로 다른 쿼리에서 직접 참조하지 않는 경우에도 작동 할 수 있습니다 .

다시, 문서 :

인덱스 된 뷰는 두 가지 방법으로 쿼리 실행에 사용될 수 있습니다. 쿼리는 인덱싱 된 뷰를 직접 참조하거나보다 중요하게는 쿼리 최적화 프로그램이 가장 저렴한 쿼리 계획에서 뷰를 일부 또는 모든 쿼리로 대체 할 수 있다고 판단되면 뷰를 선택할 수 있습니다. 두 번째 경우 기본 테이블과 일반 인덱스 대신 인덱싱 된 뷰가 사용됩니다. 쿼리 최적화 프로그램이 쿼리를 실행하는 동안 뷰를 사용하기 위해 쿼리에서 뷰를 참조 할 필요는 없습니다. 이를 통해 기존 응용 프로그램은 해당 응용 프로그램을 변경하지 않고 새로 작성된 인덱싱 된 뷰를 활용할 수 있습니다.

이 문서와 성능 향상을 보여주는 차트는 여기 에서 찾을 수 있습니다 .

업데이트 2 : 답변은 "보기"가 아니라 성능상의 이점을 제공하는 "인덱스"에 기초하여 비판되었습니다. 그러나 이것은 쉽게 반박됩니다.

우리가 소규모 국가의 소프트웨어 회사라고 가정 해 봅시다. 리투아니아를 예로 들어 보겠습니다. 전 세계적으로 소프트웨어를 판매하고 레코드를 SQL Server 데이터베이스에 보관합니다. 우리는 매우 성공적이므로 몇 년 안에 1,000,000 개 이상의 기록을 보유하고 있습니다. 그러나 종종 세금 목적으로 판매를보고해야하며 본국에서는 소프트웨어 사본 100 개만 판매 한 것으로 나타났습니다. 리투아니아어 레코드에 대한 인덱싱 된 뷰를 만들면 MS 설명서에 설명 된대로 필요한 레코드를 인덱싱 된 캐시에 보관할 수 있습니다. 2008 년 리투아니아 판매에 대한 보고서를 실행할 때 쿼리는 깊이가 7 (일부 미사용 잎이있는 Log2 (100)) 인 인덱스를 검색합니다. VIEW없이 동일한 작업을 수행하고 인덱스를 테이블에 의존하기 만하면 검색 깊이가 21 인 인덱스 트리를 탐색해야합니다!

분명히 View 자체는 인덱스 만 사용하는 것보다 성능 이점 (3 배)을 제공합니다. 실제 사례를 사용하려고했지만 간단한 리투아니아 판매 목록을 통해 더 큰 이점을 얻을 수 있습니다.

내 예제에는 직선 b- 트리를 사용하고 있습니다. SQL Server가 b- 트리의 일부 변형을 사용한다고 확신하지만 세부 정보는 알 수 없습니다. 그럼에도 불구하고 요점은 중요하다.

업데이트 3 : 인덱싱 된 뷰가 기본 테이블에 배치 된 인덱스 만 사용하는지에 대한 질문이 제기되었습니다. 즉, "인덱싱 된 뷰는 표준 인덱스와 동일하며 뷰에 새롭거나 고유 한 것을 제공하지 않습니다." 이것이 사실이라면 위의 분석은 정확하지 않습니다! 이 비판이 유효하지 않다고 생각하는 이유를 설명하는 Microsoft 문서의 인용문을 제공하겠습니다.

쿼리 성능을 향상시키기 위해 인덱스를 사용하는 것은 새로운 개념이 아닙니다. 그러나 인덱싱 된 뷰는 표준 인덱스로는 얻을 수없는 추가 성능 이점을 제공합니다.

물리적 스토리지의 데이터 지속성에 대한 위의 인용문과 뷰에서 인덱스가 작성되는 방법에 대한 문서의 기타 정보와 함께 인덱싱 된 뷰는 캐시 된 SQL 선택 이 아니라고 말하는 것이 안전하다고 생각합니다 . 기본 테이블에 정의 된 인덱스. 따라서 저는이 답변을 계속지지합니다.


29
예, 인덱싱 된 뷰는 성능을 크게 향상시킬 수 있습니다. 그러나 인덱싱 된 뷰는 단순히 "뷰"가 아니며 일반적으로 일반적인 "뷰"는 연결된 쿼리보다 빠르지 않습니다.
BradC

10
@Charles-인덱스인지 여부는 중요하지 않습니다. 뷰가 인덱스를 활용할 수 있고 원시 쿼리로는 충분하지 않다는 사실
annakata

196
/ Mark가 그의 입장을 서서 합리적으로 주장 해 준 것에 대해 @Mark에게 박수를 보냅니다
annakata

17
오, 이건 8 개의 다운 보트를 받았습니다! 사람들이 적어도 찰스가 자신의 주장을 주장 할 용기를 갖지 않으면 서 너무 빨리 공세를 줄 것이라는 것에 놀랐습니다.
마크 브리 팅엄

8
테이블에는 하나의 clusterdee 인덱스 만있을 수 있으며 뷰에서 별도의 클러스터형 인덱스를 만들 수 있습니다 (클러스터형 인덱스의 필드가 인덱스 페이지에 독립적으로 유지되기 때문에). 하나의 테이블에서 두 개의 클러스터 된 인덱스를 얻을 수 있습니다.
Charles Bretana

51

일반적으로 말해서 뷰는 주로 편의성과 보안을 위해 사용되며 그 자체로는 속도 이점이 없습니다.

즉, SQL Server 2000 이상 에는 몇 가지 경고와 함께 성능을 크게 향상시킬 수있는 인덱싱 된 뷰 라는 기능 이 있습니다 .

  1. 모든 뷰를 인덱스 된 뷰로 만들 수있는 것은 아닙니다. 그들은 따라야 할 지침의 특정 설정 수단 (다른 제한 중)이 같은 일반적인 쿼리 요소를 포함 할 수 없습니다, COUNT, MIN, MAX, 또는 TOP.
  2. 인덱싱 된 뷰는 테이블의 인덱스와 마찬가지로 데이터베이스의 실제 공간을 사용합니다.

이 기사에서는 인덱싱 된 뷰의 추가 이점과 제한 사항에 대해 설명 합니다 .

당신은 할 수 ...

  • 뷰 정의는 동일한 데이터베이스에서 하나 이상의 테이블을 참조 할 수 있습니다.
  • 고유 클러스터형 인덱스가 생성되면 뷰에 대해 클러스터되지 않은 추가 인덱스를 생성 할 수 있습니다.
  • 삽입, 업데이트, 삭제 및 절단을 포함하여 기본 테이블의 데이터를 업데이트 할 수 있습니다.

당신은 할 수 없습니다 ...

  • 뷰 정의는 다른 뷰나 다른 데이터베이스의 테이블을 참조 할 수 없습니다.
  • COUNT, MIN, MAX, TOP, 외부 조인 또는 다른 키워드 나 요소를 포함 할 수 없습니다.
  • 기본 테이블 및 열을 수정할 수 없습니다. WITH SCHEMABINDING 옵션으로 뷰가 작성됩니다.
  • 쿼리 최적화 프로그램이 수행 할 작업을 항상 예측할 수는 없습니다. Enterprise Edition을 사용하는 경우 고유 클러스터형 인덱스를 쿼리 옵션으로 자동 고려하지만 "더 나은"인덱스를 찾으면 사용됩니다. 최적화 프로그램이 WITH NOEXPAND 힌트를 통해 인덱스를 사용하도록 강요 할 수 있지만 힌트를 사용할 때는주의해야합니다.

3
전혀 동의하지 않습니다 ...보기에서 읽으면 SQL을 다시 작성할 수 있습니다. 일반적으로보기에서 덤프보다 읽기가 더 빠릅니다.
Aaron Kempf

@AaronKempf, 나는 내 경험이 아닌 그것에 대해 약간의 참조를보고 싶습니다. "View SQL rewritten"를 검색하면 docs.oracle.com/cd/E14072_01/server.112/e10810/qrbasic.htm과 같이
BradC

나는 어제 그것에 대해 벤치마킹을하고 있었고 기절했습니다 ..보기에서 (테이블로) 덤프를 가져 가면 실행하는 쿼리는 더 느립니다. 대부분의 쿼리는 버터와 같은 뷰를 통과하고 다시 작성되기 때문에 적어도 쿼리 최적화 프로그램에 의해. 곧 블로그 항목을 작성하려고하는데 벤치마킹은 매우 흥미로 웠습니다. 기본적으로보기는 성능을 크게 향상시킵니다.
Aaron Kempf

@AaronKempf 원래 질문과 동일한 시나리오인지 확실하지 않습니다 (질의와 동일한 쿼리를 뷰에 넣는 것과 관련이 있습니다). 어쨌든 새 테이블에 좋은 인덱스가 없으면 뷰를 테이블로 구체화하여 뷰를 더 느리게 만드는 방법을 알 수 없습니다 (정확하게 인덱싱 된 뷰의 기능).
BradC

1
브래드; 이 상황에서 조회수가 99 %의 실적을 저축하는 방법에 대한 정말 나쁜 블로그 게시물을 작성했습니다. 다른 기사를 작성할 계획이지만 TON에 대해 더 자세히 설명해야한다는 것을 알고 있습니다. 이것을보고 내 설명에 대해 어떻게 생각하는지 말씀해 주시겠습니까? 나는 그것이 더 이해가되지 않는다는 것을 안다 (2-3 개의 다른 기사를 얻을 때까지). 그러나 나는보기와 미치게 사랑하고있다. accessadp.com/2013/01/22/do-views-increase-performance
Aaron Kempf

14

SQL Server에서 쿼리 계획은 쿼리 /보기 매개 변수를 기반으로 뷰와 일반 SQL 쿼리 모두에 대해 계획 캐시에 저장됩니다. 두 경우 모두, 오랫동안 사용하지 않았을 때 캐시에서 삭제되며 새로 제출 된 다른 쿼리에 공간이 필요합니다. 그런 다음 동일한 쿼리가 발행되면 다시 컴파일되고 계획이 다시 캐시에 저장됩니다. 따라서 동일한 SQL 쿼리와 동일한 뷰를 동일한 빈도로 재사용한다는 점에서 차이는 없습니다.

분명히, 일반적으로보기는 본질적으로 (누군가 그것을보기에 충분할 정도로 자주 사용되어야한다고 생각 했음) 일반적으로 임의의 SQL 문보다 "재사용"될 가능성이 높습니다.


14

편집 : 내가 틀렸다, 당신은 위의 마크 답변을 볼 수 있습니다 .

SQL Server 에 대한 경험으로는 말할 수 없지만 대부분의 데이터베이스의 경우 대답은 아니요입니다. 보기를 사용하면 성능 측면에서 얻을 수있는 유일한 이점은 쿼리를 기반으로 일부 액세스 경로를 만들 수 있다는 것입니다. 그러나 뷰를 사용하는 주된 이유는 쿼리를 단순화하거나 테이블의 일부 데이터에 액세스하는 방법을 표준화하기위한 것입니다. 일반적으로 말하면 성능상의 이점은 없습니다. 그래도 틀렸을 수도 있습니다.

나는 약간 더 복잡한 예를 생각해보고 스스로 볼 시간이다.


1
뷰에 대한 또 다른 이유는 역할 기반 모델에 액세스 제어를 지원하는 것입니다
annakata

1
성능 향상에 대해 틀 렸습니다. 나는 원래 의견에 일부 사람들을 설득시킬만큼 충분히 설명하지 않았지만 MS는 성능을 향상시키기 위해 뷰를 사용하는 방법에 대한 명시적인 문서를 가지고 있습니다. 아래의 내 (지금은 크게 하향 조정 된) 응답을 참조하십시오.
Mark Brittingham

7

구체화 된 뷰를 작성하면 ( 스키마 바인딩 사용 ) 더 빠를 수 있습니다 . 구체화되지 않은 뷰는 일반 쿼리처럼 실행됩니다.


schemabinding은 성능과 거의 관련이 없으며 뷰의 스키마를 기본 테이블에 바인드하여 동기화 상태를 유지하며 인덱싱 된 뷰의 사전 요구 사항입니다.
Sam Saffron

5

SQL Server가 실행 계획을 저장 한 다음 즉시 파악하려고하는 대신 사용하기 때문에 뷰가 더 빠르다는 것을 이해합니다. 요즘의 성능 향상은 아마도 예전만큼 크지 않을 것이라고 생각하지만보기를 사용하기 위해 약간의 개선이있을 것이라고 추측해야합니다.


이것은 나의 이해였습니다. 더는 중요하지 않습니다
annakata

성능 관점에서 보지 못함-액세스 제한 수단으로 사용합니다. 그러나 그것은 또 다른 주제 일 것입니다. ;)
AnonJr

아, 물론, 원시 쿼리를 사용하는 단일 뷰가 아닌 뷰를 사용해야하는 많은 이유가 있습니다. : P
annakata

4

확실히 뷰는 SQL Server의 중첩 쿼리보다 낫습니다. 왜 Mark Brittingham의 게시물을 읽을 때까지 더 나은지 정확히 알지 못했지만 뷰와 중첩 쿼리를 사용할 때 몇 가지 테스트를 실행하고 거의 충격적인 성능 향상을 경험했습니다. 각 버전의 쿼리를 한 번에 수백 번 실행 한 후 쿼리의 뷰 버전이 절반으로 완료되었습니다. 나는 그것이 충분한 증거라고 말하고 싶습니다.


고마워요 조던 ...이 모든 이론이 실제 세계 에서 잘 작동한다고 들게되어 기쁩니다 .
Mark Brittingham

중첩보기 (보기에서)에 경험이 있으며 성능이 매우 좋지 않습니다. 모든 뷰를 하위 선택으로 다시 쓰면 성능이 여러 배 빨라져 심각한 테스트가 필요할 수 있습니다.
Muflix

2

두 쿼리가 동일하게 수행 될 것으로 기대합니다. 뷰는 저장된 쿼리 정의에 지나지 않으며 뷰에 대한 데이터 캐싱 또는 저장은 없습니다. 옵티마이 저는 첫 번째 쿼리를 실행할 때 두 번째 쿼리로 효과적으로 전환합니다.


뷰가 작은 필드 집합이고 해당 필드가 인덱스로 덮여있는 경우 SQL Server는 두 번째 형식의 쿼리를 수행 할 때 해당 인덱스를 사용할만큼 영리합니까?
AnthonyWJones

1

그것은 모두 상황에 달려 있습니다. MS SQL 인덱싱 된 뷰는 일반 뷰나 쿼리보다 빠르지 만 미러 된 데이터베이스 환경 (MS SQL)에서는 인덱싱 된 뷰를 사용할 수 없습니다.

루프에서 호출 될 때마다 뷰가 다시 채워 지므로 모든 종류의 루프에서 뷰를 사용하면 심각한 속도 저하가 발생합니다. 검색어와 동일합니다. 이 상황에서 # 또는 @를 사용하여 데이터를 루프 스루하는 임시 테이블은 뷰나 쿼리보다 빠릅니다.

따라서 상황에 따라 다릅니다.


0

실질적인 차이가 없으며 BOL을 읽으면 평범한 이전 SQL SELECT * FROM X가 계획 캐싱 등을 활용한다는 것을 알 수 있습니다.



0

뷰의 목적은 쿼리를 반복해서 사용하는 것입니다. 이를 위해 SQL Server, Oracle 등은 일반적으로 뷰의 "캐시 된"또는 "컴파일 된"버전을 제공하여 성능을 향상시킵니다. 일반적으로이 방법은 "간단한"쿼리보다 성능이 뛰어나지 만 쿼리가 실제로 매우 단순하면 이점이 무시 될 수 있습니다.

이제 복잡한 쿼리를 수행하는 경우보기를 작성하십시오.


0

필자가 찾은 결과보기를 사용하는 것이 일반 쿼리보다 약간 빠릅니다. 내 저장 프로 시저 는 약 25 분이 걸리고 (다른 더 큰 레코드 세트 및 여러 조인으로 작업) 뷰를 사용한 후 (클러스터되지 않은) 성능은 조금 빨랐지만 전혀 중요하지 않았습니다. 나는 다른 쿼리 최적화 기술 / 방법을 사용하여 극적인 변화를 만들어야했습니다.


쿼리 작성 / 설계 방법은 매우 중요합니다.
kta

나는 / 조인 등 많은 경우에 CTE의이 획기적으로 향상된 성능 오프 테이블에서 반환하는 데이터를 제한 할 수 CTE의를 사용하고 모든 일을 발견했다
매트

0

보기 또는 테이블에서 선택하면 의미가 없습니다.

물론 뷰에 불필요한 조인, 필드 등이없는 경우 뷰 성능을 향상시키는 데 사용되는 쿼리, 조인 및 인덱스의 실행 계획을 확인할 수 있습니다.

더 빠른 검색 요구 사항을 위해보기에서 색인을 작성할 수도 있습니다. http://technet.microsoft.com/en-us/library/cc917715.aspx

그러나 '% ... %'와 같이 검색하는 경우 SQL 엔진보다 텍스트 열의 인덱스가 도움이되지 않습니다. 사용자가 '... %'와 같은 검색을 수행하도록 강요하면 그보다 빠릅니다.

ASP 포럼에서 답변 참조 : https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+


0

모든 기대에 반하여, 어떤 상황에서는 견해가 더 느립니다.

최근에 Oracle에서 가져온 데이터에 다른 형식으로 마사지 해야하는 데 문제가있을 때 이것을 발견했습니다. 20k 개의 소스 행일 수 있습니다. 작은 테이블. 이를 위해 오라클 데이터를 테이블로 가져올 수있는 그대로 변경 한 다음 뷰를 사용하여 데이터를 추출했습니다. 우리는 그러한 견해에 근거한 2 차 견해를 가지고있었습니다. 어쩌면 3-4 수준의 전망 일 수 있습니다.

200 개의 행을 추출한 최종 쿼리 중 하나가 45 분 이상 걸립니다. 이 쿼리는 일련의 뷰를 기반으로합니다. 어쩌면 3-4 레벨 깊이.

문제의 각 뷰를 가져 와서 하나의 중첩 된 쿼리에 sql을 삽입하고 몇 초 안에 실행할 수 있습니다.

심지어 각 뷰를 임시 테이블에 작성하고 뷰 대신 쿼리를 쿼리 할 수 ​​있으며 단순히 중첩 뷰를 사용하는 것보다 훨씬 빠릅니다.

더 이상한 점은 데이터베이스로 가져 오는 소스 행의 한계에 도달 할 때까지 성능이 좋았다는 것입니다. 며칠 동안 공간에서 절벽을 떨어 뜨 렸습니다. 소스 행이 몇 개 더 필요했습니다.

따라서 뷰에서 가져온 쿼리를 사용하는 것은 중첩 된 쿼리보다 훨씬 느리므로 나에게 의미가 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.