У меня слишком медленный запрос.Я не уверен, какую всю информацию я должен предоставить, чтобы вам было легче помочь мне, но я сделаю удар и добавлю больше, когда ваши большие мозги неизбежно попросят вещи, которые я либо не сделал.Не думаю, чтобы включить или не знаю, что такое.
Я хочу идентифицировать клиентов (но используя только часть их адреса - размещение домашних хозяйств и предприятий), которые впервые зарегистрировали покупку в 2006 году.
Моя первая попытка была:
select
distinct a.line1 + '|' + substring(a.zip,1,5)
from
registrations r
join customers c on r.custID = c.id
join addresses a on c.addressID = a.id
where year(r.purchaseDate) = 2006
and a.line1 + '|' + substring(a.zip,1,5) not in (
select
distinct a.line1 + '|' + substring(a.zip,1,5)
from
registrations r
join customers c on r.custID = c.id
join addresses a on c.addressID = a.id
where
year(r.purchaseDate) < 2006
)
, и когда он работал слишком долго, я переключал NOT EXISTS (с которым я менее удобен, но желаю экспериментировать) как
select
distinct a.line1 + '|' + substring(a.zip,1,5)
from
registrations r
join customers c on r.custID = c.id
join addresses a on c.addressID = a.id
where
year(r.purchaseDate) = 2006
and not exists (
select
1
from
registrations r
join customers c on r.custID = c.id
join addresses ia on c.addressID = ia.id
where
ia.line1 + '|' + substring(ia.zip,1,5) = a.line1 + '|' + substring(a.zip,1,5) and
year(r.purchaseDate) < 2006
)
group by
a.line1 + '|' + substring(a.zip,1,5)
Но это слишком долго.Вроде нет результатов за 17 часов вроде слишком долго.Я думаю, что первое, что нужно рассмотреть, - это где мой SQL может быть неправильным или неоптимальным, но в случае, если это не так, я также хочу дать вам достаточно информации для рассмотрения среды.
Итак, диагностическая информация.Возможно, вам все равно, но на всякий случай: он работает на сервере G6 с четырьмя четырехъядерными процессорами и 20 ГБ ОЗУ;каждый запрос ограничен четырьмя процессорами, чтобы поддерживать производительность запросов на веб-сервере;когда я выполняю этот запрос, мы удаляем другие крупные операции импорта и отчеты из-за взаимоблокировок, но веб-сервер ориентирован на клиентов и не может быть остановлен.) Примерно: 15 миллионов регистраций, 11 миллионов клиентов и 8,6миллион адресов.Я перестроил все индексы, чтобы быть уверенным, что проблема не в фрагментации.Тем не менее, я не совсем уверен, как правильно индексировать, поэтому я полностью готов к тому, чтобы это было проблемой - некоторые из этих индексов были результатом моего суеты, а некоторые были сценариями, которые мне дал один из инструментов анализа MSулучшить производительность.Я также не совсем уверен, как донести до вас информацию об индексе, поэтому я просто дам сценарии создания:
ALTER TABLE [dbo].[registrations] ADD CONSTRAINT [PK_flatRegistrations_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
.
ALTER TABLE [dbo].[customers] ADD CONSTRAINT [PK_flatCustomers_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
.
ALTER TABLE [dbo].[addresses] ADD CONSTRAINT [PK_addresses] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [addresses] ON [dbo].[addresses]
(
[line1] ASC,
[line2] ASC,
[city] ASC,
[state] ASC,
[zip] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [deliverable] ON [dbo].[addresses]
(
[addressDeliverable] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [_dta_index_addresses_5_1543676547__K9_K1_6] ON [dbo].[addresses]
(
[addressDeliverable] ASC,
[ID] ASC
)
INCLUDE ( [zip]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [_dta_index_addresses_5_1543676547__K1_K9_6] ON [dbo].[addresses]
(
[ID] ASC,
[addressDeliverable] ASC
)
INCLUDE ( [zip]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [_dta_index_addresses_5_1543676547__K1_6] ON [dbo].[addresses]
(
[ID] ASC
)
INCLUDE ( [zip]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Спасибо большое за ваше время!