Извините длинный вопрос!Как эффективно делать запросы по базе данных?
У нас есть две таблицы базы данных, например. Автомобиль и колесо. Они связаны тем, что колесо принадлежит автомобилю, а автомобиль имеет несколько колес. Колеса, однако, могут быть изменены без ущерба для «версии» автомобиля. Запись автомобиля может быть обновлена (например, задание на краску), не влияя на версию колес (т. Е. Без каскадного обновления).
Например, таблица автомобилей в настоящее время выглядит следующим образом:
CarId, CarVer, VersionTime, Colour
1 1 9:00 Red
1 2 9:30 Blue
1 3 9:45 Yellow
1 4 10:00 Black
В таблице Wheels выглядит следующим образом (этот автомобиль имеет только два колеса!)
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 версии этот двухколесный автомобиль. Это первое колесо (WheelId 1) не изменилось. Второе колесо было изменено (например, нарисовано) в 10:05.
Как эффективно выполнять запросы, которые могут быть присоединены к другим таблицам по мере необходимости? Обратите внимание, что это новая база данных, и мы владеем схемой и можем ее изменить или добавить таблицы аудита, чтобы упростить этот запрос. Мы пробовали один подход к таблице аудита (с колонками: CarId, CarVersion, WheelId, WheelVersion, CarVerTime, WheelVerTime), но это не улучшило наш запрос.
Пример запроса: показать идентификатор автомобиля 1, как это было, включая его данные о колесах с 9:50. Этот запрос должен привести эти две строки возвращаются:
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
Лучший запрос, мы могли бы придумать было это:
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)
И, если вы хотите попробовать это, то создать таблицу и вставку запись 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
Ваш запрос более эффективен (меньше сканирования таблиц), но не выполняет запрос запроса. Ваш запрос получает только последнюю версию, а не версию с 09:50. Возможно, мы сможем взять некоторые идеи из вашего запроса, поэтому спасибо. – ng5000
Мы не сможем использовать представления, поскольку нам нужно будет передать компонент времени запроса в запрос. SP могут быть опцией, но с необходимостью присоединения к другим таблицам, возможно, потребуется посмотреть на функции таблицы. – ng5000
Отредактировано новым подходом к датам. – Andomar