긴 질문을 용서하십시오!데이터베이스를 이용한 쿼리를 효과적으로 수행하는 방법은 무엇입니까?
우리는 예를 들어, 두 개의 데이터베이스 테이블을 가지고 자동차와 휠. 휠은 자동차에 속하고 자동차에는 여러 개의 휠이 있다는 점에서 서로 관련이 있습니다. 그러나 차는 "버전"에 영향을 미치지 않고 변경 될 수 있습니다. 휠의 버전 (예 : 캐스케이드 업데이트 없음)에 영향을주지 않고 자동차 기록을 업데이트 할 수 있습니다 (예 : 페인트 작업). 예를 들어
는, 차 테이블은 현재 다음과 같습니다
바퀴가 테이블 (이 차가 두 바퀴가 있어요!)WheelId, WheelVer, VersionTime, CarId
1 1 9:00 1
1 2 9:40 1
1 3 10:05 1
2 1 9:00 1
그래서, 4 개 버전이있었습니다 다음과 같습니다
CarId, CarVer, VersionTime, Colour
1 1 9:00 Red
1 2 9:30 Blue
1 3 9:45 Yellow
1 4 10:00 Black
이 두 륜 자동차. 첫 번째 휠 (WheelId 1)은 변경되지 않았습니다. 두 번째 바퀴는 10:05에 변경되었습니다 (예 : 페인트 칠). 필요에 따라
어떻게 효율적으로 다른 테이블에 가입 할 수 쿼리로해야합니까? 이 데이터베이스는 새로운 데이터베이스이며 스키마를 소유하고 변경하거나 감사 테이블을 추가하여이 쿼리를보다 쉽게 만들 수 있습니다. CarId, CarVersion, WheelId, WheelVersion, CarVerTime, WheelVerTime과 같은 열을 사용하여 하나의 감사 테이블 접근 방식을 시도했지만 실제로 쿼리를 개선하지는 못했습니다.
예 질의 : 그것은 9시 50분의로서의 휠 기록을 포함했다으로 자동차 ID 1을 표시합니다. 당신이 다음이 시도 테이블 및 삽입을 만들려는 경우,
select c.CarId, c.VersionTime, w.WheelId,w.WheelVer,w.VersionTime,w.CarId
from Cars c,
( select w.WheelId,w.WheelVer,w.VersionTime,w.CarId
from Wheels w
where w.VersionTime <= "12 Jun 2009 09:50"
group by w.WheelId,w.CarId
having w.WheelVer = max(w.WheelVer)
) w
where c.CarId = w.CarId
and c.CarId = 1
and c.VersionTime <= "12 Jun 2009 09:50"
group by c.CarId, w.WheelId,w.WheelVer,w.VersionTime,w.CarId
having c.CarVer = max(c.CarVer)
그리고 우리가 가지고 올 수
WheelId, WheelVer, WheelVerTime, CarId, CarVer, CarVerTime, CarColour
1 2 9:40 1 3 9:45 Yellow
2 1 9:00 1 3 9:45 Yellow
가장 좋은 쿼리가이 :이 쿼리는이 두 행이 반환되는 결과합니다 레코드 SQL은 다음과 같습니다.
create table Wheels
(
WheelId int not null,
WheelVer int not null,
VersionTime datetime not null,
CarId int not null,
PRIMARY KEY (WheelId,WheelVer)
)
go
insert into Wheels values (1,1,'12 Jun 2009 09:00', 1)
go
insert into Wheels values (1,2,'12 Jun 2009 09:40', 1)
go
insert into Wheels values (1,3,'12 Jun 2009 10:05', 1)
go
insert into Wheels values (2,1,'12 Jun 2009 09:00', 1)
go
create table Cars
(
CarId int not null,
CarVer int not null,
VersionTime datetime not null,
colour varchar(50) not null,
PRIMARY KEY (CarId,CarVer)
)
go
insert into Cars values (1,1,'12 Jun 2009 09:00', 'Red')
go
insert into Cars values (1,2,'12 Jun 2009 09:30', 'Blue')
go
insert into Cars values (1,3,'12 Jun 2009 09:45', 'Yellow')
go
insert into Cars values (1,4,'12 Jun 2009 10:00', 'Black')
go
쿼리가 더 효율적 (테이블 스캔은 적음)이지만 as-of 쿼리를 수행하지 않습니다. 09:50 버전이 아닌 최신 버전 만 조회됩니다. 우리는 귀하의 질의에서 몇 가지 아이디어를 얻을 수 있습니다. 감사합니다. – ng5000
쿼리의 시간 구성 요소를 쿼리에 전달해야하므로 뷰를 사용할 수 없습니다. SP는 옵션 일 수 있지만 다른 테이블에 가입해야 테이블 함수를 살펴볼 필요가 있습니다. – ng5000
날짜에 대한 새로운 접근 방식으로 편집되었습니다. – Andomar