0

...의겠습니까 여러는 SQL 서버에 최적화 한 전망에 합류 복수에 있습니다 문 존재가 모든 제 3 자에 대한 테이블의 한 세트이고 DB는 다음 .... 좋은했다 태초에

하나 우리의 제 3자는 노출 된 일부 데이터를 다른 모든 고객 데이터 솔루션을 숨기기 위해 필요로했습니다. 다른 제 3자를 위해 데이터를 복제하고 미러링 된 세트에만 액세스 할 수있는 다른 테이블 세트 (!!!)를 만드는 것이 었습니다. 테이블 .... 다른 제 3자가 똑같이 ... 그리고 또 다른 한개를 요구할 때까지 ... 그리고 나서 나는 들어왔다. ...

ATM 나는 제 3 자 당 앉아서 Views 세트를 소개하려고 생각하고있다. 제 3 자에 있음 Schema과 원래의 테이블로부터 서브 셀렉트를 실시한다 ... 테이블을 소개하려고하고있는 분에게 신기록을 표시하는 새로운 것 Views를 식별한다. 어디 특정 집합의보기에서 표시해야 할 레코드에 대한 PK 및 소유자 열이있을 것이다. (다른 옵션은 PK를 보유하고있는 소유자 테이블을 소유자 테이블에 추가하고 거기에서 소유자를 식별하는 것입니다 ...)

내보기는 다음과 같이 보일 것입니다. 이름은 그림 일뿐입니다.) :

원래 테이블에는 수십만 개의 레코드가 있으므로 성능에 대해 생각하고있었습니다. 각 타사가 쿼리를 실행하고 그들의 견해에 합류 할 때 SQL Server는 여러 개의 동일한 반복을 최적화하기에 충분히 똑똑 할 것입니다

where exists (select 1 from [RecordOwner] 
       where [Id] = ot.[MasterId] and [Owner] = 'Owner1') 

아니요?

편집 : 고려 다음 쿼리 3 자 dev에 글이 다음

SELECT * FROM 
    (SELECT * FROM [OriginalTable2] ot 
    where exists (select 1 from [RecordOwner] where [Id] = ot.[MasterId] and [Owner] = 'Owner1')) t2 
inner join 
    (SELECT * FROM [OriginalTable3] ot 
    where exists (select 1 from [RecordOwner] where [Id] = ot.[MasterId] and [Owner] = 'Owner1')) t3 
on t2.MasterId = t3.Masterid 

로 번역 것이며, 두 테이블이 MasterId에 PK를

SELECT * from [3rdPartyTable2] t2 
inner join [3rdPartyTable3] t3 on t2.MasterId = t3.Masterid 

.

뷰에 여러 개의 반복 된 EXISTS 절을 최적화하기에 SQL Server가 충분히 똑똑합니까?

+0

'Id' /'MasterId'는 ID 필드가 아니라 GUID라고 가정합니다! 그렇지 않으면 겹칠 것입니다. 어쨌든,'RecordOwner'의 PK가'Owner'와'MasterId'라면,'Where EXISTS() '대신'JOIN'을 사용하지 않으시겠습니까? 각각의 경우 왜 서버가 마술처럼 'RecordOwner' 테이블에 대한 다른 링크를'병합 '할 것으로 예상하는지 혼란 스럽습니다. 'ot2'의 값은'ot3'의 값과 아무런 관련이 없습니다 .... 즉, 나는 성능에 대해 너무 걱정하지 않을 것입니다. 각 클라이언트에 대해 테이블의 복사본을 동기화하는 것이 훨씬 더 많은 노력을 할 것입니다. 자원. – deroby

답변

0

TL;JOINS을 사용하여 생성 된 뷰는 EXISTS을 사용하여 생성 된 뷰와 같거나 빠릅니다 (그리고 그들은 LEFT OUTER JOINS에서 최적화됩니다).

@ Gordon의 대답을 확인한 것처럼 실험을했는데 뷰와 인덱스를 수행하고 데이터베이스에있는 PK 레코드 데이터의 93 %를 채웠습니다. 실행 계획에서 볼 때 3 개의 테이블을 결합 할 때 3 개의 스캔을 수행했음을 알 수 있습니다. ..

enter image description here

오버 헤드 (~ 가입 당 3 %)을 ...하지만 최소한

EDIT : LEFT OUTER JOIN에 전망을 접합 할 때 동일 테스트 및 실행 플랜의 다른 세트를 실행하지만 INNER JOINS보기를 할 때 보다는 JOIN를 사용 EXISTS 후자 능가 구성되는 S ...와 뷰

예 조인 뷰

CREATE VIEW [dbo].[Summary2] 
AS 
SELECT st.* 
    FROM [OriginalSummary] st 
    inner join [RecordOwner] ro on ro.[Id] = st.[MasterId] and [Owner] = 'corp1' 

enter image description here

예 존재합니다 :

CREATE VIEW [dbo].[Summary] 
AS 
SELECT * 
FROM [OriginalSummary] ot 
WHERE EXISTS (SELECT 1 FROM [RecordOwner] 
       WHERE [Id] = ot.[MasterId] AND [Owner] = 'corp1') 
GO 

enter image description here

0

댓글이 너무 깁니다.

너 무슨 소리 야? exists 표현식은 상관 된 하위 쿼리를 사용하고 있습니다. 따라서 외부 쿼리의 다른 테이블을 참조하기 때문에 각각 별도의 다른 쿼리입니다.

인덱스가 RecordOwner(Id, Owner) 인 경우 성능이 괜찮을 것입니다. 그러나 테스트해야합니다.

보기 각 클라이언트에 대해 작성하는 것도 좋습니다. 클라이언트는 숨겨진 보안 메커니즘에 의존하기보다는 table_client이라는 항목에보다 편리하게 액세스 할 수 있습니다.

+0

안녕 고든, 제 3 자가'T2 [[3rdPartyTable3] t2.MasterId에 T3는 = t3.Masterid' 이 다음 로 변환 할 가'(* FROM 을 선택 조인 내부 OriginalTable2 [3rdPartyTable2] SELECT * FROM 선택하고 기록 상상 ] 내부 조인 (SELECT * FROM [OriginalTable3] ot ) (존재하는 경우 (1을 선택하십시오.)어디 존재합니까 ([MasterOd] 및 [Owner] = 'Owner1') [RecordOwner] [RecordOwner]에서 [Id] = [MasterId] 및 [Owner] = 'Owner1'))) 두 테이블 모두 마스터 레코드 –

+0

@MatasVaitkevicius에 PK가 있습니다. . . SQL Server 또는 다른 데이터베이스가 "존재하는"데이터베이스 중 하나를 최적화하는 것을 진지하게 생각합니다. –

관련 문제