У меня есть следующая таблица
| Path | Version | FirstName | LastName |
| People/Frank | 1 | Frank | Smith |
| People/Frank | 2 | Frank | Jones |
| People/Jack | 1 | Jack | Johnson |
Я бы хотел, чтобы мой запрос возвращал Path
и Max Version
для всех строк, соответствующих заданному критерию.
В настоящее время я делаю это;
select Path, MAX(Version) as Version from Table where FirstName = 'Frank' group by Path;
Это действительно критичная для производительности часть кода, и мне интересно, могу ли я что-то конкретное сделать с сервером sql, чтобы сделать это быстрее, или если что-то упущено.
Кроме того, я хотел бы убедиться, что мои ограничения определены правильно. Я ожидаю, что запросы будут содержать какие-либо или все столбцы, которые не являются путем и версией, так что вы можете в вышеупомянутом случае запросить либо FirstName, LastName, либо оба. Моя таблица создания sql выглядит так:
create table Index_PersonByFirstName(
FirstName NVarChar(100) not null,
LastName NVarChar(100) not null,
Path NVarChar(100) not null,
Version Int not null,
constraint pk_Index_PersonByFirstName primary key(
FirstName,
LastName,
Path,
Version),
constraint uc_Index_PersonByFirstName_Path_Version unique (
Path,
Version),
constraint fk_People_Path_Version foreign key (
Path,
Version) REFERENCES People(Path, Version))
Имеет ли смысл удалить Path
из первичного ключа, поскольку он никогда не запрашивается напрямую?
Другой вариант, который я рассмотрел, - это наличие столбца, который указывает, является ли строка «последней» версией для данного пути, и обновление старых строк при записи нового, но это выглядит странно.
Ваши мысли будут высоко оценены. Если я недостаточно подробно изложил, пожалуйста, дайте мне знать, и я добавлю любую другую необходимую информацию.