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

Откуда:
Сообщений: 7
Добрый день!
Проблема такая: на большом периоде(месяц) запрос очень долго выполняется. Подскажите, как можно его оптимизировать?

SELECT
AccessPoint.Code as Code,SUM(IPCallEvent.Duration) AS SumDuration,IPCallEvent.TerminateIPAddr as IPAddr,IPCallEvent.Called,IPCallEvent.Calling,
IPCallEvent.SetupTime,Subscriber.Name,IPCallEvent.OriginateIPAddr
FROM IPCallEvent
LEFT JOIN AccessPoint ON AccessPoint.ID = IPCallEvent.AccessPointID
LEFT JOIN Account ON Account.ID = IPCallEvent.OriginateAccID
LEFT JOIN Subscriber ON Subscriber.ID = Account.SubscriberID

WHERE (SetupTime >= '2011-8-1' AND SetupTime <='2011-8-31')

GROUP BY Code,TerminateIPAddr,IPCallEvent.Called,IPCallEvent.Calling,IPCallEvent.SetupTime,Subscriber.Name,OriginateIPAddr
7 сен 11, 10:49    [11238904]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
nick-krsk
Добрый день!
Проблема такая: на большом периоде(месяц) запрос очень долго выполняется. Подскажите, как можно его оптимизировать?
Начать с плана запроса.
7 сен 11, 10:58    [11239002]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
nick-krsk, а сколько записей в IPCallEvent и сколько выполняется запрос?
С уважением, Алексей
P.S. Должен быть точно LEFT JOIN а не INNER JOIN ?
7 сен 11, 10:58    [11239003]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
alexeyvg,

Как его делать? :)
Описать, что происходит в запросе?
7 сен 11, 11:03    [11239046]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
nick-krsk
alexeyvg,

Как его делать? :)
Описать, что происходит в запросе?
В SSMS есть кнопочка - Include Actual Execution Plan

Если её нажать, то после выполнения запроса рядом с вкладкой результата появится вкладка с планом.

Потом нужно запустить справку, найти описание итерпретации плана и изучать.
7 сен 11, 11:06    [11239065]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
Aleksey-K
nick-krsk, а сколько записей в IPCallEvent и сколько выполняется запрос?
С уважением, Алексей
P.S. Должен быть точно LEFT JOIN а не INNER JOIN ?


Записей больше миллиона. Запрос выполняется около получаса.

Да, LEFT JOIN больше подходит.
7 сен 11, 11:07    [11239071]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
nick-krsk
Aleksey-K
nick-krsk, а сколько записей в IPCallEvent и сколько выполняется запрос?
С уважением, Алексей
P.S. Должен быть точно LEFT JOIN а не INNER JOIN ?


Записей больше миллиона. Запрос выполняется около получаса.

Да, LEFT JOIN больше подходит.


Т.е. INNER JOIN больше подходит.
7 сен 11, 11:13    [11239125]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
aleks2
Guest
nick-krsk
Aleksey-K
nick-krsk, а сколько записей в IPCallEvent и сколько выполняется запрос?
С уважением, Алексей
P.S. Должен быть точно LEFT JOIN а не INNER JOIN ?


Записей больше миллиона. Запрос выполняется около получаса.

Да, LEFT JOIN больше подходит.


Дарагуля, риальные пацаны сначала группируют, а уж потом прихерачивают фсякую требуху. Ибо сервер любить нада.
7 сен 11, 11:16    [11239146]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
aleks2
nick-krsk
пропущено...


Записей больше миллиона. Запрос выполняется около получаса.

Да, LEFT JOIN больше подходит.


Дарагуля, риальные пацаны сначала группируют, а уж потом прихерачивают фсякую требуху. Ибо сервер любить нада.


Можно подробнее
7 сен 11, 11:19    [11239182]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
nick-krsk, окромя всего прочего:
1. Изучите тег SRC
2. Осознайте для чего нужны псевдонимы
3. Отак писать не надобно, см. локальнезависимое представление даты:
SetupTime >= '2011-8-1' AND SetupTime <='2011-8-31'
7 сен 11, 11:19    [11239183]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
aleks2
Guest
nick-krsk
aleks2
пропущено...


Дарагуля, риальные пацаны сначала группируют, а уж потом прихерачивают фсякую требуху. Ибо сервер любить нада.


Можно подробнее


Подробнее, тока если ты в своем запросе всем полям припишешь явно таблицу, а то телепаты у нас уволились...
7 сен 11, 11:22    [11239207]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
nick-krsk
nick-krsk
пропущено...


Записей больше миллиона. Запрос выполняется около получаса.

Да, LEFT JOIN больше подходит.


Т.е. INNER JOIN больше подходит.

Это вы должны решить, надо ли возвращать из IPCallEvent записи, для которых нет соответствия, например, в AccessPoint
С уважением, Алексей
7 сен 11, 11:25    [11239230]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
aleks2
nick-krsk
пропущено...


Можно подробнее


Подробнее, тока если ты в своем запросе всем полям припишешь явно таблицу, а то телепаты у нас уволились...


Вот, прописал:

SELECT
AccessPoint.Code as Code,SUM(IPCallEvent.Duration) AS SumDuration,
IPCallEvent.TerminateIPAddr as IPAddr,IPCallEvent.Called,IPCallEvent.Calling,
IPCallEvent.SetupTime,Subscriber.Name,IPCallEvent.OriginateIPAddr
FROM IPCallEvent
INNER JOIN AccessPoint ON AccessPoint.ID = IPCallEvent.AccessPointID
INNER JOIN Account ON Account.ID = IPCallEvent.OriginateAccID
INNER JOIN Subscriber ON Subscriber.ID = Account.SubscriberID
WHERE (SetupTime >= '2011-8-4' AND SetupTime <='2011-8-5')
GROUP BY AccessPoint.Code,IPCallEvent.TerminateIPAddr,IPCallEvent.Called,IPCallEvent.Calling,
IPCallEvent.SetupTime,Subscriber.Name,IPCallEvent.OriginateIPAddr
7 сен 11, 11:33    [11239307]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
aleks2
Guest
SELECT
AccessPoint.Code as Code
Subscriber.Name,
X.*
FROM
(
	SELECT
	IPCallEvent.AccessPointID, 
	IPCallEvent.OriginateAccID,
	SUM(IPCallEvent.Duration) AS SumDuration,
	IPCallEvent.TerminateIPAddr as IPAddr,
	IPCallEvent.Called,
	IPCallEvent.Calling,
	IPCallEvent.SetupTime,
	IPCallEvent.OriginateIPAddr
	FROM IPCallEvent 
	WHERE (IPCallEvent.SetupTime >= '20110804' AND IPCallEvent.SetupTime <='20110805') 
	GROUP BY 
	IPCallEvent.AccessPointID,
	IPCallEvent.OriginateIPAddr, 
	IPCallEvent.TerminateIPAddr,
	IPCallEvent.Called,
	IPCallEvent.Calling,
	IPCallEvent.OriginateAccID
	IPCallEvent.SetupTime
) X
INNER JOIN AccessPoint ON AccessPoint.ID = X.AccessPointID
INNER JOIN Account ON Account.ID = X.OriginateAccID 
INNER JOIN Subscriber ON Subscriber.ID = Account.SubscriberID 

Ежели ишо и кластерный индекс по SetupTime будет... то ваще фантастика.
7 сен 11, 11:44    [11239433]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
nick-krsk, если селективность поля SetupTime велика (можно оценить как отношение общего кол-во записей в таблице к кол-ву записей, попавших в условие отбора по SetupTime), то имеет смысл иметь кластерных индекс по SetupTime в IPCallEvent
С уважением, Алексей
7 сен 11, 11:45    [11239442]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
nick-krsk
Member

Откуда:
Сообщений: 7
Спасибо!
7 сен 11, 12:31    [11239891]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
И всё-таки
kDnZP
1. Изучите тег SRC
2. Осознайте для чего нужны псевдонимы
+100
7 сен 11, 12:43    [11239995]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Коляныч
Member

Откуда:
Сообщений: 279
nick-krsk
Aleksey-K
nick-krsk, а сколько записей в IPCallEvent и сколько выполняется запрос?
С уважением, Алексей

Записей больше миллиона. Запрос выполняется около получаса.

Для начала за сколько отработает такой запрос?

SELECT COUNT(*) FROM IPCallEvent WHERE (SetupTime >= '20110801' AND SetupTime <'20110901') 


просто если у вас по дате никак не проиндексировано, то быстрее уже никак не отработает. Судя по названиям ID полей остальных таблиц, на основе которых всё джойнится, эти ID первичные ключи, то есть как минимум по ним проиндексировано, значит они быстренько могут приджойниться, значит скорей всего проблема не в них, а в медленной выборке по первой таблице.
7 сен 11, 17:27    [11242920]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить