У меня есть следующая структура базы данных:Как ускорить sql-запросы? Индексы?
create table Accounting
(
Channel,
Account
)
create table ChannelMapper
(
AccountingChannel,
ShipmentsMarketPlace,
ShipmentsChannel
)
create table AccountMapper
(
AccountingAccount,
ShipmentsComponent
)
create table Shipments
(
MarketPlace,
Component,
ProductGroup,
ShipmentChannel,
Amount
)
Я следующий запрос работает на этих таблицах, и я пытаюсь оптимизировать запрос запустить как можно быстрее:
select Accounting.Channel, Accounting.Account, Shipments.MarketPlace
from Accounting join ChannelMapper on Accounting.Channel = ChannelMapper.AccountingChannel
join AccountMapper on Accounting.Accounting = ChannelMapper.AccountingAccount
join Shipments on
(
ChannelMapper.ShipmentsMarketPlace = Shipments.MarketPlace
and ChannelMapper.AccountingChannel = Shipments.ShipmentChannel
and AccountMapper.ShipmentsComponent = Shipments.Component
)
join (select Component, sum(amount) from Shipment group by component) as Totals
on Shipment.Component = Totals.Component
Как Я запускаю этот запрос как можно быстрее? Должен ли я использовать индексы? Если да, то в каких столбцах таблицы следует индексировать?
Вот фотография моего плана запроса:
Спасибо,
Индексы необходимы. Все, что содержится в предложении WHERE, является кандидатом на индексирование. Можете ли вы опубликовать фактическую схему вместо своей абстрактной версии? – tadman
Моделирование данных имеет решающее значение. Во-первых: добавьте в свои столбцы некоторые реальные типы (возможно, домены). Второе: ограничения PK/FK являются элементарными. В-третьих: (как правило, если в таблицах имеется более двух ключей-кандидатов, они подозреваются. Ваши таблицы каналов и отправлений _could_ страдают от этого явления (могут быть BCNF или 4NF vioalations), но вы не показывали никаких ключей-кандидатов, и даже семантика нечеткая. – wildplasser