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

Откуда:
Сообщений: 16
select top 1 mt.id
from MyTable mt
where mt.phonenum = tt.phonenum
and tt.Data > mt.date
--and mt.date >= tt.startDate
order by mt.date
desc

tt - табличка из 5000 записей.
mt - здооровенная таблица.

Запрос за месяц делается минут 40 - час.
получилось значительно ускорится добавив закомментированную строку.

Ну мне больше интересует как сделать запрос красивше, без top1 да и потом order by / desc удрать. Может как-то можно MAX припести. Вообще, интересует насколько оптимальна доставшаяся мне конструкция и как её сделать красивши
20 июл 12, 11:49    [12892455]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
cander,
Запрос то хоть правильно напишите tt вообще нет.
Постройте индекс по условию сортировки.
Можете посмотреть в сторону row_number().
20 июл 12, 11:57    [12892525]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
что-то мне подсказывает что здесь обычный MAX подойдет
20 июл 12, 11:59    [12892539]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
denis2710
cander,
Запрос то хоть правильно напишите tt вообще нет.
Постройте индекс по условию сортировки.
Можете посмотреть в сторону row_number().


tt - временная табличка. В ней колонки только те, которые есть в запросе
20 июл 12, 13:36    [12893195]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
HandKot
что-то мне подсказывает что здесь обычный MAX подойдет

Вот тогда, пожалуйста, напишите как с MAX сработать.
20 июл 12, 13:37    [12893201]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
denis2710
cander,
Запрос то хоть правильно напишите tt вообще нет.
Постройте индекс по условию сортировки.
Можете посмотреть в сторону row_number().


Зачем row_number()? Там ТОР1?
Индексы, кажется по полю номера телефона, но то уже последнюю очередь

Интересует как можно переписать запрос, что бы избавиться от ТОР1
20 июл 12, 13:40    [12893216]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
svenom
Member [заблокирован]

Откуда:
Сообщений: 3242
Надо не с TOP начинать, а с плана выполнения. Может там полная жопа в другом месте, а TOP вообще почти никак не влияет на время выполнения.
Что бы вам оказали грамотную помощь, выложите сюда план запроса, тогда и будем говорить.
20 июл 12, 13:48    [12893260]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
svenom
Member [заблокирован]

Откуда:
Сообщений: 3242
Ну и запрос надо по-человечески написать. А то он у вас не только не отформатирован, но и ошибочен. В общем чем качественней будет вопрос, тем качественней получите ответ.
20 июл 12, 13:49    [12893264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
cander
Вот тогда, пожалуйста, напишите как с MAX сработать

select Max(mt.id)
from MyTable mt
where mt.phonenum = tt.phonenum 
and tt.Data > mt.date 
--and mt.date >= tt.startDate 
20 июл 12, 13:50    [12893272]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
HandKot
cander
Вот тогда, пожалуйста, напишите как с MAX сработать

select Max(mt.id)
from MyTable mt
where mt.phonenum = tt.phonenum 
and tt.Data > mt.date 
--and mt.date >= tt.startDate 


Ага, там Order by по другому полю, по дате. и в MAX нужно дату, но нам нужен именно ИД с минимальной датой
20 июл 12, 16:09    [12894176]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
svenom
Надо не с TOP начинать, а с плана выполнения. Может там полная жопа в другом месте, а TOP вообще почти никак не влияет на время выполнения.
Что бы вам оказали грамотную помощь, выложите сюда план запроса, тогда и будем говорить.


Что такое план запроса не знаю. Но что нужно напишу.

Есть таблица
T1 - здоровенная до 500 000 записей
id
phonenum
date
...
и

T2 - основная отфильтрованная таблица 5 000 записей
id
phonenum
date

связаны они по phonenum
Вот нужно выбрать T1.id где максимальнная дата из T1 < даты в T2 для одного и того же номера
20 июл 12, 16:24    [12894277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
Вы бы показали весь запрос а не только его часть
не уверне, что вообще сработает

select mt.id
from
	MyTable mt
inner join (
	select mt.id, Max(mt.Data) md
	from MyTable mt
	where mt.phonenum = tt.phonenum 
	and tt.Data > mt.date 
	group by mt.id) m on m.id = mt.id And m.md = mt.date
20 июл 12, 16:30    [12894314]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
а индекс на поле date таблицы Т1 есть?
20 июл 12, 16:46    [12894396]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
cander
Member

Откуда:
Сообщений: 16
HandKot
а индекс на поле date таблицы Т1 есть?

Подскажите как можно проверить. И ещё, разве индексы работают, если операция больше, меньше?
20 июл 12, 17:22    [12894531]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
в менеджмент студии в дереве объектов раскрываете таблицу внутри раскрываете ветку индексы
20 июл 12, 23:31    [12895648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить