2014-06-23 4 views
3

MS-SQL 쿼리어떻게 여러 왼쪽 외부 조인 속도를 높일 수 있습니까?

저는 왼쪽 내부 조인이 많이 있습니다.

NumberOfRow = 약 30 행

결과 시간이 4 초에 관한 것이다.

어떻게이 쿼리의 속도를 높일 수 있습니까? PK 이드입니다

, 인덱스 RegionID

DECLARE @Location TABLE 
     (
     Id int IDENTITY(1,1) PRIMARY KEY not null, 
     RegionID int , 
     RegionType int , 
     SubClass int , 
     RegionName nvarchar(255) , 
     RegionNameLong nvarchar(512) , 
     ParentRegionID int 
) 

INSERT INTO @Location (RegionID, RegionType, SubClass, RegionName, RegionNameLong, ParentRegionID) 
SELECT ORIGIN.RegionID AS RegionID 
    ,ORIGIN.RegionType AS RegionType 
    ,ORIGIN.SubClass AS SubClass 
    ,REFER.RegionName AS RegionName 
    ,REFER.RegionNameLong AS RegionNameLong 
    ,ORIGIN.ParentRegionID AS ParentRegionID 
FROM Location_en_US AS ORIGIN 
    INNER JOIN Location_ko_KR AS REFER ON ORIGIN.RegionID = REFER.RegionID 

SELECT 
    TOP 10 
    EN_1.RegionID, EN_1.RegionName, EN_2.RegionID, EN_2.RegionName, EN_3.RegionID, EN_3.RegionName, EN_4.RegionID, EN_4.RegionName, EN_5.RegionID, EN_5.RegionName, EN_6.RegionID, EN_6.RegionName 
FROM @Location  AS EN_1 
    LEFT OUTER JOIN @Location AS EN_2 ON EN_1.ParentRegionID = EN_2.RegionID 
    LEFT OUTER JOIN @Location AS EN_3 ON EN_2.ParentRegionID = EN_3.RegionID 
    LEFT OUTER JOIN @Location AS EN_4 ON EN_3.ParentRegionID = EN_4.RegionID 
    LEFT OUTER JOIN @Location AS EN_5 ON EN_4.ParentRegionID = EN_5.RegionID 
    LEFT OUTER JOIN @Location AS EN_6 ON EN_5.ParentRegionID = EN_6.RegionID 
    INNER JOIN RegionType  AS RT ON EN_1.RegionType = RT.TypeCode AND RT.LanguageCode = 'en_US' 
    INNER JOIN SubClass   AS SC ON EN_1.SubClass = SC.TypeCode AND SC.LanguageCode = 'en_US' 
WHERE EN_1.RegionNameLong LIKE '%SEUOL%' 

이 사용 HIERARCHYID이지만, 가장 낮은는 외부 ParentRegionIDRegionID

CREATE TABLE dbo.Location_en_US(
    Id int IDENTITY(1,1) PRIMARY KEY NOT NULL, 
    Level hierarchyid NOT NULL, 
    RegionID int NOT NULL, 
    RegionType int NOT NULL, 
    RelativeSignificance nvarchar(3) NULL, 
    SubClass int NULL, 
    RegionName nvarchar(255) NOT NULL, 
    RegionNameLong nvarchar(512) NOT NULL, 
    ParentRegionID int NULL, 
    CreatedAt datetime2 NULL DEFAULT (getdate()), 
) 

SELECT RegionName AS RegionName1, 
(SELECT RegionName FROM Location_en_US WHERE Level = Location.Level.GetAncestor(1)) AS Level2, 
(SELECT RegionName FROM Location_en_US WHERE Level = Location.Level.GetAncestor(2)) AS Level3, 
(SELECT RegionName FROM Location_en_US WHERE Level = Location.Level.GetAncestor(3)) AS Level4, 
(SELECT RegionName FROM Location_en_US WHERE Level = Location.Level.GetAncestor(4)) AS Level5, 
(SELECT RegionName FROM Location_en_US WHERE Level = Location.Level.GetAncestor(5)) AS Level6 
FROM Location_en_US AS Location WHERE RegionNameLong LIKE '%SEOUL%' 
+0

당신은 중복 된 왼쪽 결합의'en_2 - en_6'을 어떤 목적으로 가지고 있습니까? – xacinay

+0

@xacinay : 부모가 존재하지 않을 때 부모가 NULL이되는 부모 영역에 각 조인이 연결되는 것 같습니다. –

+0

@Chris Walsh, 이제 알 수 있습니다 - 6 레벨 트리 조건입니다 ... [hierarhyId tecnique] (http://msdn.microsoft.com/ru-ru/library/bb677173.aspx)가 여기에 적용 가능합니다 – xacinay

답변

1

나무와 비슷한 구조로는 HierarhyId tecnique을 사용해야합니다.

빌드 색인 ParentRegionID, RegionID에 대한 빌드.

또한 나열된 조인 테이블 중 하나도 쿼리 결과 집합에 선택되지 않습니다.

+0

나는 이걸 사용하지만, 속도를 가장 낮게하고 왼쪽으로 가라. 쿼리 시간은 약 9 초입니다. – user3444535

0

당신은 가입하고 가입 떠났다. 두 열의 색인이 도움이 될 수 있습니다. 인덱스를 추가하려면 먼저 테이블 변수 @Location에서 임시 테이블 #Location으로 전환해야합니다.

인덱스를 추가 한 후 쿼리 메뉴에서 "쿼리 계획"을 검토하여 이것이 어떻게 도움이되는지 확인하십시오.

+0

나는 이것을 시험해 볼 것이다. – user3444535

0

regionId에 대한 색인을 추가하십시오.

명시 적으로 테이블 변수에 인덱스를 추가, 그래서이 트릭을 사용할 수 없습니다

DECLARE @Location TABLE 
     (
     Id int IDENTITY(1,1) PRIMARY KEY not null, 
     RegionID int , 
     RegionType int , 
     SubClass int , 
     RegionName nvarchar(255) , 
     RegionNameLong nvarchar(512) , 
     ParentRegionID int, 
     UNIQUE (regionId, id) 
     ) 

또한, 왼쪽은 아마 같은 기록을 곱하여 제외하고 아무것도하지 조인. 당신의 질문이 맞습니까?

+1

이 쿼리는 '키워드'제약 조건 '메시지 근처에 잘못된 구문이 있습니다. 이 쿼리가 정확하다고 확신합니다. – user3444535

+0

@ user3444535 : 'EN_1'에서 열만 선택하므로 조인 된 테이블은 곱셈에 기여할 수 있습니다. – Andomar

+0

@Andomar 오, 알겠습니다, 선택 TOP 10 EN_1.RegionID, EN_1.RegionName, 올바른 쿼리가 아닙니다. – user3444535

관련 문제