2009-11-18 5 views
0

나는 다음과 같은 테이블 구조했습니다 -SQL Server : 디자인 : 포함 Select 문 또는 INNER JOIN?

사이트 : 마스터 tablefor 사이트

조직 : 조직

에 대한 마스터 테이블을

사용자 : 사용자에 대한 마스터 테이블 (각 사용자 고유 한 조직에 대한 링크 : User.OrgId)

OrgSite : 일부 '조직 고유'사이트 정보 (OrgId, SiteId, SiteName, SiteCode)를 저장하십시오. 모든 사이트가 아니라 Org.

UserSite : 사용자를 액세스 할 수있는 사이트 (UserId, SiteId)에 링크하십시오. 사용자가 Org UserSite에 연결되어 있으므로 은 OrgSite 테이블의 하위 집합이됩니다. 일부 항목 & 사이트의 특정 세부 사항 (항목 ID, SiteId, OrgId, ...) 이제

, i를 'ItemSite'에서 \ 디스플레이 레코드를 필터링 할했습니다를 저장하는 테이블 :

을 ItemSite 그리고 Sitecode를 표시해야합니다. - 이것은 'OrgSite'테이블에서 사용할 수있는 모든 조직의 특정 세부 사항에 나에게 액세스 권한을 부여합니다 vw_ItemSite_UserSite_OrgSite (INNER이 SiteId의 모든 테이블을 조인) :

1. VIEW 만들기 - 그래서, 나는 다음과 같은 두 가지 옵션 참조 (즉 Sitecode를, 등)

내가 포함하도록했습니다 알 수 없다면 'OrgSite'나는 조직 특정 Sitecode를 & 사이트 이름을 원하는 때문 뷰입니다. UserSite는 이미 사이트를 필터링하기 위해 이므로 - 은 OrgSite 테이블을 '제외'하고 은 불필요한 내부 조인을 제거 할 수 있습니다. -

위의 노트
을 바탕으로 는

2. 두 번째 옵션은 VIEW를 만드는 것입니다 다음 내가 좋아하는 다음 SELECT를 포함 할 수있는 VIEW의 문을 'SELECT'vw_ItemSite_UserSite과에 -

CREATE VIEW vw_ItemSite_UserSite AS 
SELECT ItemSite.SiteID, 
(SELECT TOP 1 [SiteCode] FROM OrgSite WHERE OrgId = ItemSite.OrgId) AS SiteCode, 
... 
FROM ItemSite INNER JOIN UserSite ON ItemSite.SiteId = UserSite.SiteId 

나의 유일한 의도는 - 나는 INNER JOIN과 WHERE가 임베디드 select 문의 평가 전에 평가 될 것이라고 생각합니다. 그렇다면 성능이 어느 정도 떨어질까요? 아니면 vw_ItemSite_UserSite_OrgSite를 사용하는 것이 좋습니다.

옵션 # 1 또는 옵션 # 2?

고맙습니다.

답변

2

주의점 : Premature optimization. 두 쿼리가 모두 같은 결과를 반환하면 이해하기 쉽고 유지하기 쉬운 쿼리를 사용하십시오.쿼리 작업 (조인, 선택, ...)이 성능을 최적화하는 순서로 수행되는지 확인하는 것이 SQL Server의 작업입니다. 그리고 대개의 경우 SQL Server는이를 잘 수행합니다.

즉, 인데 SQL Server 쿼리 분석기가 최적의 쿼리 계획을 찾지 못해 사용자 자신을 세부적으로 조정해야하는 경우가 있습니다. 그러나 드문 경우입니다. 쿼리에 성능 문제가 이미 있거나 (누락 된 인덱스를 도입하여 해결할 수 없다면), 지금 당장 걱정할 사항이 아닙니다.

1

몇 가지 테스트를 만들고 성능을 확인하고 주어진 환경에서 실제로 어느 성능이 가장 우수한지 확인하십시오.

+0

그렇다면 옵션 # 1과 옵션 # 2는 모두 성능 관점과 비슷합니까? 분명히 옵션 # 1이 훨씬 간단하고 직선으로 선택되기 때문에! –

+0

나는 어느 쪽이 더 좋다는 것을 말하지 않는다. 내가 말하는 것은 단지 몇 가지 테스트를 실행하고 볼 수 있습니다. 당신의 경우에 이것을하기위한 테스트를 설정하는 것이 얼마나 힘들겠습니까? 무언가가 어떻게 수행되는지에 대한 가장 좋은 지표는 테스트를 실행하고 결과에 따라 결론을 내리는 것입니다. 저는 항상 누군가가 옵션 1이나 옵션 n이 진짜 어려운 사실이없는 최선의 선택이라고 말하면서 매우 겁이납니다. – Kuberchaun

0

옵션 1은 거의 빠를 것입니다. 내장 된 SELECT는 일반적으로 성능에 좋지 않습니다.

그러나 우리의 말을 믿지 마십시오. 두 가지를 모두 코드화하고 쿼리 계획을 확인하면서 시도하십시오. 이 경우 조기에 최적화 할 수는 있지만, 배울 수있는 좋은 간단한 테스트 케이스이기 때문에 제대로 수행 할 수있는 방법을 알기 때문에 올바른 방법으로 문제가 발생했을 때 그 의미가 무엇인지 알 수 있습니다. 때로는 거대한 같은 쿼리를 작성하는 여러 가지 방법의 성능 차이로 인해 최적화 프로그램에서 아무 것도 할 수 없으므로 일반적인 규칙을 배우고 인생이 행복해집니다.