Поможите оптимизировать...

Rainmib
Дата: 14.10.2003 18:14:34
SELECT d.DestHost, u.Name, send=SUM(w.sent)

FROM WebFact as w, - Факты
VIH as T, - 20 самых посещаемых хостов
Users as U, - Юзеры
Dest as d - Хосты
WHERE DatePart(mm,w.Date)=DatePart(mm,GetDate())
and w.DestHostID = T.DestHostID
and w.UserNameID = u.UserID
and w.DestHostID = d.DESTID
GROUP BY u.Name, d.DestHost
ORDER BY u.Name, d.DestHost, send DESC


Совсем не мудрёный запрос а вешает всё к чертям собачим...даже бывает вываливается с переполнением транзакт лога в tempdb
Luchkin Dmitry
Дата: 14.10.2003 18:21:44
ужасть! глянь использование left join/inner join/...
избавишься от конструкции select ... from t1, t2, .... - будет щастье
Rainmib
Дата: 14.10.2003 18:24:43
Будет ли быстрее?
Luchkin Dmitry
Дата: 14.10.2003 18:25:37
ну у вас карты на руках - смотрите ;-) на мой взгляд гораздо быстрее дОлжно быть
Некто
Дата: 14.10.2003 18:25:41
2 Luchkin Dmitry

Не факт, что поможет. Теоретически, план выполнения может и не измениться.

2 Rainmib

Вы бы план выполнения запроса привели бы.
Glory
Дата: 14.10.2003 18:26:48
1. Интересное условие - DatePart(mm,w.Date)=DatePart(mm,GetDate()) - для чего оно в запросе ?

2. Индексы по ID полям имеются ?

3. Каков план выполнения ? Хотя бы предварительный.
Rainmib
Дата: 14.10.2003 18:35:05
Все то что ID - является ПК в данной таблице
Про план я ниче не знаю чё это за зверь я тут не местный ;)
Rainmib
Дата: 14.10.2003 18:36:24
автор писал:
Интересное условие - DatePart(mm,w.Date)=DatePart(mm,GetDate()) - для чего оно в запросе ?


Ибо данных в фактах лежит мильон строк - а интересно за месяц посмотреть

с просто
month(d.Date)

такаяже картина
Glory
Дата: 14.10.2003 18:39:24
То бишь т.к. у нас сегодня октябрь, то посмотреть все октябри всех годов ??
Некто
Дата: 14.10.2003 18:41:13
SET SHOWPLAN_TEXT ON 

GO
-- Ваш запрос

SELECT d.DestHost, u.Name, send=SUM(w.sent)
FROM WebFact as w, -- Факты

VIH as T, -- 20 самых посещаемых хостов

Users as U, -- Юзеры

Dest as d -- Хосты

WHERE DatePart(mm,w.Date)=DatePart(mm,GetDate())
and w.DestHostID = T.DestHostID
and w.UserNameID = u.UserID
and w.DestHostID = d.DESTID
GROUP BY u.Name, d.DestHost
ORDER BY u.Name, d.DestHost, send DESC
GO
-- вариант

SELECT d.DestHost, u.Name, send=SUM(w.sent)
FROM ( select DestHostID, UserNameID , DestHostID from WebFact WHERE DatePart(mm, Date)=DatePart(mm,GetDate()) ) w -- Факты за текущий месяц

inner join VIH T on w.DestHostID = T.DestHostID -- 20 самых посещаемых хостов

inner join Users U on w.UserNameID = u.UserID -- Юзеры

inner join Dest d on w.DestHostID = d.DESTID -- Хосты

GROUP BY u.Name, d.DestHost
ORDER BY u.Name, d.DestHost, send DESC


результаты в студию. :-)