Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Долго работает запрос :(( Как можно оптимизировать?  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
Есть две таблицы, связанные по текстовому полю varchar(10)
В таблице-справочнике 1500 записей, в подчиненной - около 100.000.

Построено представление "последний вызов", в котором для каждой записи справочника (work_log - "выходы на линию") выбирается хронологически последнее значение из подчиненной таблицы (calls - "заявки"). Связь выполняется по полю work_log_id ("ID выхода на линию"):

SELECT w.id as work_log_id,
(SELECT TOP 1 c.go_time
FROM calls c
WHERE
wl.id = c.work_log_id
ORDER BY go_time DESC) AS go_time
FROM dbo.work_log w

Запрос работает секунды три. Надо, чтобы он это делал почти мгновенно ;)
Поля work_log.id, calls.work_log_id проиндексированы.
Можно ли соптимизировать запрос, или стоит перестроить архитектуру данных?
Спасибо

ЗЫ: извините, если сформулировано не очень четко :)
5 дек 04, 12:37    [1158668]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос :(( Как можно оптимизировать?  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
Ааа, сорри :) в первой фразе - ошибка,

"Есть две таблицы, связанные по текстовому полю varchar(10)"

таблицы связаны по id (int)
5 дек 04, 12:39    [1158670]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос :(( Как можно оптимизировать?  [new]
Taffy
Member

Откуда:
Сообщений: 20501
Честное слово, не знаю будет это быстрее или нет. Но я бы написала так

SELECT w.id as work_log_id, MAX(c.go_time)AS go_time
FROM dbo.work_log w inner join
	calls c on w.id = c.work_log_id
group by w.id
5 дек 04, 12:47    [1158674]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос :(( Как можно оптимизировать?  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
А так не будет быстрее:

SELECT w.id work_log_id, t.go_time
from dbo.work_log w
left join (select c.work_log_id, max(c.go_time) go_time from calls c group by work_log_id) t on t.work_log_id = w.id

?

Или можно так обойтись:

select c.work_log_id, max(c.go_time) go_time from calls c group by work_log_id

?
5 дек 04, 12:51    [1158680]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос :(( Как можно оптимизировать?  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
Ххха! Ощутимо!

Спасибо, мисс ;)
5 дек 04, 12:52    [1158681]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос :(( Как можно оптимизировать?  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
Sorry, не успел прочесть ответ Taffy... Медленно пишу.
5 дек 04, 12:52    [1158682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить