Получение последних X много записей медленно - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица с 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
...