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이지만, 가장 낮은는 외부 ParentRegionID
및 RegionID
에
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%'
당신은 중복 된 왼쪽 결합의'en_2 - en_6'을 어떤 목적으로 가지고 있습니까? – xacinay
@xacinay : 부모가 존재하지 않을 때 부모가 NULL이되는 부모 영역에 각 조인이 연결되는 것 같습니다. –
@Chris Walsh, 이제 알 수 있습니다 - 6 레벨 트리 조건입니다 ... [hierarhyId tecnique] (http://msdn.microsoft.com/ru-ru/library/bb677173.aspx)가 여기에 적용 가능합니다 – xacinay