У меня есть таблица с 18,2 миллионами записей (Транспортные средства). Выбор 30 лучших автомобилей выполняется быстро (~ 1 мс), а выбор последних 30 - медленный (25-30 секунд). Как я могу улучшить производительность получения последних X много записей?
Около 50% транспортных средств принадлежат к одной категории, 25% к другой категории и 25% к еще одной категории. Можно ли каким-то образом разбить таблицу базы данных для ускорения поиска?
В каждом транспортном средстве хранится деталь, которой принадлежит транспортное средство. В настоящее время есть 460 000 деталей, которые являются собственностью транспортных средств. Сами части принадлежат к одной из 2222 категорий. Таким образом, я мог бы разделить транспортные средства и по этим категориям.
Я немного читал о разделении таблиц, думаю, что это может быть путь, но я не уверен. Столбец, который я хотел бы разделить на динамически, изменяется по мере добавления строк. При этом я думаю, что он доступен только в редакции Enterprise? Я не думаю, что кто-то из наших клиентов, вероятно, имел бы это.
Если не делать несколько копий таблицы (возможно, это не ужасная идея), у меня есть другие варианты?
Делает линесколько копий таблицы - разумное решение?
Обратите внимание, я разработчик программного обеспечения, а не администратор баз данных.
Таблица выглядит примерно так:
CREATE TABLE dbo.Vehicles (
Id int IDENTITY(1,1) NOT NULL,
partId int not NULL, -- this column currently has 469,707 distinct values
partTerminologyId int not NULL, -- this column currently has just over 2,000 distinct values
partCategoryId int not NULL, -- this column will likely never have more than 3 distinct values (with 50%, 25%, 25% distribution)
[year] int not NULL,
makeId int not null,
modelId int not null,
submodelId int not null
-- there are 50-odd other columns which are all Ids of things like manufacturere, fuel type, etc
CONSTRAINT pk_Vehicles PRIMARY KEY CLUSTERED (Id asc)
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_Vehicles_partId] ON dbo.Vehicles (partId)
CREATE NONCLUSTERED INDEX [IX_dbo_Vehicles_baseVehicle] ON dbo.Vehicles ([year], makeId, modelId)
alter table Vehicles
ADD CONSTRAINT FK_dbo_Vehicles FOREIGN KEY (partId)
REFERENCES Parts (Id) ON DELETE CASCADE