2011-02-05 4 views
3

저장 프로 시저의 원시 테이블 대신보기를 쿼리하는 것이 좋습니다. (비록 뷰가 다른 데이터를 제공하지 않는다고해도)저장 프로 시저의 테이블 대신 뷰를 사용합니까?

나는 추상화의 추가 레이어와 클래스 함수의 멤버 변수 대신 속성을 사용하는 것과 비슷하기 때문에 항상 좋은 아이디어라고 생각했다.

하지만 지금은 ASP.NET 멤버십 공급자가 만든 저장 프로 시저를보고 테이블에 대해 항상 쿼리합니다.

뷰를 사용할 때 데이터를 쉽게 삽입 할 수 없다는 것을 알고 있지만 저장 프로 시저가 데이터를 쿼리하는 경우에도 테이블을 직접 사용해야합니까? 그렇다면 주된 이유는 무엇입니까? (성능?)

답변

6

보기는 외부 쿼리로 확장되는 매크로입니다.

보기에 여러 조인이 포함 된 경우 다른보기에 조인 할 때 실제로 저장 프로 시저의 SQL에 3 개의 조인을 볼 때 갑자기 20 또는 30 방향 JOIN이 발생합니다. 또한 각 쿼리가 다르다는 사실을 알게 될 것입니다. 왜 모든 쿼리에 대해 동일한 20 개 또는 30 개의 테이블을 계속 가입시키는 것입니까?

일반적으로보기가 색인화/구체화되지 않고 최적화 프로그램이이를 사용할 수있는 경우가 아니면 이점이 없습니다.

보기로 마스킹 된 단일 테이블에서 계산하는 것과 같은 아이디어는 계산 된 열에 있어야합니다. 왜 계속 계산합니까? 뷰의 여러 테이블에 대한 계산의 경우 인덱싱해야합니다.

저장 프로 시저를 사용할 때 이미 기본 테이블 액세스 (소유권 체인)가 없음을 의미합니다. 사용자가 직접 테이블 액세스를 방지하기 위해, 또는 스키마 변경 마스크, 또는 몇 가지 기본적인 보안을 제공하기 위해보기 좋은 용도가 있습니다

(예 SUSER_SNAME 기준),하지만 SQL Server의 성능이나 idealogy

3

다른 데이터베이스 최적화 프로그램은 다른 방식으로 쿼리를 최적화하므로 쉬운 대답이 아닙니다. 그러나 일반적으로 추상화 계층을 추가하면 (정확하게는 아님) 최적화 프로그램이 인덱스를 올바르게 사용하지 못하게 할 수 있습니다. 는 SQL 서버에서

당신이 좋아하는 통화를 포함하는 where 절이있는 경우 :

  • 가 null을
  • LIKE '% 뭔가'
  • 은하지 그것이 non-sargable을하게

존재 쿼리, 즉 인덱스를 사용하지 않는 쿼리 또는 하위 인덱스를 사용합니다.

보기를 사용하면 sarg에도 영향을 미친다 고 생각합니다. 내가 가서 SQL 서버에서 테스트 해 보겠다. 5 분 안에 다시 올게. 내가 대답은 '가 따라'당신은 반드시 당신의 쿼리 실행 계획을 설정해야한다는 것을 추측

는, 다음 테스트가 나는 쿼리 간단한 사이에 유의 한 차이를 보이지 않았다 않았다 편집

테이블을 기반으로보기 및 기본 테이블을 쿼리하는 것입니다. 복잡한보기가 다르게 작동 할 수 있으므로 추가 테스트가 필요합니다.

Sql Execution Plan for accessing a simple view compared to the table directly

+0

"나는 (SQL Server에서)이 테스트를 해보고 5 분 안에 다시 올거야." ㅎ, 고마워. 나는 여기서 기다릴 것이다. : D – magnattic

+0

그것은 단지 4 분이었다! – amelvin

0

나는이 두 경우에 저장 프로 시저에서 뷰를 사용하고 있습니다 :

1 - 복잡한 조인 또는 여러 절차

이 필요하다 조건에 대한 - 이름이 바뀐 테이블에 대한 대체 값을 . 예를 들어 'member'와 'non_member'라는 두 개의 테이블이있었습니다. 나중에 이들을 '사용자'테이블에 결합하기로 결정했습니다. 필자가 작성한 모든 proc를 수정하는 것을 피하기 위해 'member'와 'non_member'라는 뷰를 만들었는데 여기서 'user'테이블을 적절히 필터링하기 위해 where 절을 사용했습니다. 모든 procs는 변경 사항없이 그대로 사용되었습니다. 시간이있을 때 테이블을 직접 액세스 할 수 있도록 변경할 수 있습니다.

0

(대한 적어도), 내 이해는 저장 프로 시저가 컴파일 시간에 최적화되어 있으므로 뷰보다 일반적으로 더 효율적입니다. 나는 확신 할 수는 없지만 SPRC를 뷰에 대해 실행함으로써 최적화를 잃을 수도 있습니다.

왜, 어떨까요? 이전 포스터가 맹목적으로 말한 것처럼, 포함하고있는 뷰 중 하나 이상이 수많은 조인으로 구성된 경우 필요한 것보다 더 많은 조인을 수행 할 수 있으며 이는 분명하지 않습니다.

또한 뷰를 사용하는 주된 이유 중 하나는 실수로 변경되지 않도록 테이블 데이터를 보호하면서 사용자가 소비 할 수있는 형식으로 테이블 데이터를 제공한다는 것입니다. SPROC로부터의 결과 세트는 INSERT와 UPDATES의 대상이 아니므로,이 점은 중요하지 않습니다.

디자인에 의한 저장 프로시 저는 매개 변수를 허용하고 사용자가 테이블 데이터와 직접 상호 작용할 수 없으며 뷰에서 사용할 수있는 모든 쿼리 로직을 실행할 수 있기 때문에 (몇 가지 예외를 제외하고) 이것이 수행 할 수있는 주된 이유는 성능 및 유지 관리의 잠재적 인 비용으로 CODING을 더 쉽게 만드는 것입니다 (SPROC가 SPROC에 의존한다는 것을 깨닫지 못하고 누군가가 뷰 중 하나를 변경하면 어떻게됩니까?).

다른 이유가없는 한 SPROC에 모두 코딩하는 것이 좋습니다. . .