交叉应用性能不佳,转换为 unpivot(或其他)?
Cross apply not performant, convert to unpivot (or other)?
插入大型数据集时交叉应用非常慢,我认为 unpivot(或其他东西)可能更有效但除了使用交叉应用我不知道如何做:
CREATE TABLE LocData
(Airport varchar(5), City varchar(5), Country varchar(5))
;
INSERT INTO LocData
(Airport, City, Country)
VALUES
('LHR','LON','GB'),
('LGW','LON','GB'),
('LCY','LON','US'),
('JFK','NYC','US'),
('LGA','NYC','US'),
('EWR','NYC','US')
;
CREATE TABLE Travel
(ID int, Dep varchar(5), Arr varchar(5))
;
INSERT INTO Travel
(ID, Dep, Arr)
VALUES
(1, 'LHR','JFK'),
(2, 'LHR','EWR'),
(3, 'LGA','LGW'),
(4, 'LCY','EWR')
;
--查询
select * from Travel;
select
c.*
from Travel t
join LocData dep on dep.Airport=t.Dep
join LocData arr on arr.Airport=t.Arr
cross apply
(
values
(t.ID, dep.Airport, 0, arr.Airport, 0),
(t.ID, dep.City, 1, arr.City, 1),
(t.ID, dep.Country, 2, arr.Country, 2)
) c (ID, Dep, DepType, Arr, ArrType);
您的查询是:
select c.*
from Travel t join
LocData dep
on dep.Airport = t.Dep join
LocData arr
on arr.Airport = t.Arr cross apply
(values (t.ID, dep.Airport, 0, arr.Airport, 0),
(t.ID, dep.City, 1, arr.City, 1),
(t.ID, dep.Country, 2, arr.Country, 2)
) c(ID, Dep, DepType, Arr, ArrType);
这似乎是做您想做的事情的一种非常有效的方法。性能应该不错。
Locadata(airport)
上的索引可以提高性能。您还可以包括 city
和 country
列(include
它们或使它们成为附加键)。我会定义 table 使用它作为主键(它会自动创建最好的索引类型):
CREATE TABLE LocData (
Airport varchar(5) PRIMARY KEY,
City varchar(5),
Country varchar(5)
);
(合理假设它永远不会 NULL
并且永远不会重复。)
换句话说,我真心怀疑 apply
会影响性能。 join
更有可能是罪魁祸首。
插入大型数据集时交叉应用非常慢,我认为 unpivot(或其他东西)可能更有效但除了使用交叉应用我不知道如何做:
CREATE TABLE LocData
(Airport varchar(5), City varchar(5), Country varchar(5))
;
INSERT INTO LocData
(Airport, City, Country)
VALUES
('LHR','LON','GB'),
('LGW','LON','GB'),
('LCY','LON','US'),
('JFK','NYC','US'),
('LGA','NYC','US'),
('EWR','NYC','US')
;
CREATE TABLE Travel
(ID int, Dep varchar(5), Arr varchar(5))
;
INSERT INTO Travel
(ID, Dep, Arr)
VALUES
(1, 'LHR','JFK'),
(2, 'LHR','EWR'),
(3, 'LGA','LGW'),
(4, 'LCY','EWR')
;
--查询
select * from Travel;
select
c.*
from Travel t
join LocData dep on dep.Airport=t.Dep
join LocData arr on arr.Airport=t.Arr
cross apply
(
values
(t.ID, dep.Airport, 0, arr.Airport, 0),
(t.ID, dep.City, 1, arr.City, 1),
(t.ID, dep.Country, 2, arr.Country, 2)
) c (ID, Dep, DepType, Arr, ArrType);
您的查询是:
select c.*
from Travel t join
LocData dep
on dep.Airport = t.Dep join
LocData arr
on arr.Airport = t.Arr cross apply
(values (t.ID, dep.Airport, 0, arr.Airport, 0),
(t.ID, dep.City, 1, arr.City, 1),
(t.ID, dep.Country, 2, arr.Country, 2)
) c(ID, Dep, DepType, Arr, ArrType);
这似乎是做您想做的事情的一种非常有效的方法。性能应该不错。
Locadata(airport)
上的索引可以提高性能。您还可以包括 city
和 country
列(include
它们或使它们成为附加键)。我会定义 table 使用它作为主键(它会自动创建最好的索引类型):
CREATE TABLE LocData (
Airport varchar(5) PRIMARY KEY,
City varchar(5),
Country varchar(5)
);
(合理假设它永远不会 NULL
并且永远不会重复。)
换句话说,我真心怀疑 apply
会影响性能。 join
更有可能是罪魁祸首。