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