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

Откуда: Екатеринбург
Сообщений: 78
Вводная информация
Таблица UserEvent с полями:
- id_rec - ссылка на запись-источник события
- createDate - дата события
- id_author - автор события
Таблица UserLink с полями:
- id_user - идентификатор пользователя
- id_link - друг пользователя

Необходимо выбрать все события (UserEvent), у которых id_author текущий пользователь или его друзья. В результате получился такой запрос:

select ue.*
 from UserEvent ue, userlink ul
    where 
(ul.id_user=@idUser and and ue.id_author=ul.id_friend)
or
ue.id_author=@idUser


Смущает условие выборки "or ue.id_author=@idUser", не связанное с записями таблицы userlink. Была ли у кого-нибудь раньше подобная задача, как такой запрос будет отрабатывать с 1000 друзей и 50000 событий?
24 авг 12, 07:11    [13058190]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
aleks2
Guest
-- если те надо быстро - тады так

declare @t table (id int primary key clustered);
insert @t
  select id_friend from userlink
  where ul.id_user=@idUser;
insert @t 
  values(@idUser);


select ue.*
 from UserEvent ue inner join @t t on ue.id_author=t.id;

-- и не ленись явно писать JOIN
24 авг 12, 07:23    [13058197]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
ksv55
Member

Откуда:
Сообщений: 93
Limonad,
SELECT ue.*
 FROM UserEvent ue 
   WHERE ue.id_author in
(SELECT ul.id_link FROM userlink ul WHERE ul.id_user = @idUser)
OR
ue.id_author=@idUser
24 авг 12, 07:35    [13058204]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
aleks2
Guest
ksv55
Limonad,
SELECT ue.*
 FROM UserEvent ue 
   WHERE ue.id_author in
(SELECT ul.id_link FROM userlink ul WHERE ul.id_user = @idUser)
OR
ue.id_author=@idUser


тормоз тоже механизм.
24 авг 12, 07:38    [13058210]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
aleks2,

Спасибо за ответ.

Добавлю немного еще нюанс:

Таблица UserEvent с полями:
- actiontype - типы событий
- id_rec - ссылка на запись-источник события
- createDate - дата события
- id_author - автор события
Таблица UserLink с полями:
- id_user - идентификатор пользователя
- id_link - друг пользователя

Необходимо выбрать все события (UserEvent), у которых id_author текущий пользователь или его друзья + события над записями, добавленными в избранное. В результате получился такой запрос:


select ue.id
from UserEvent ue, userlink ul
where
(ul.id_user=@idUser and (ue.actiontype in (1,7,8) and ue.id_author=ul.id_rec and ul.linkType='friend')) - события друзей
or
(ue.actiontype in (2,3,5) and ue.id_author=@idUser) - события пользователя
or
(ul.id_user=@idUser and (ue.id_atuhor!=@idUser and ue.actiontype=3 and ue.id_rec=ul.id_rec and ul.linkType='recordFavorite')) - события над записями, добавленными в избранное

Смущает условие выборки "or ue.id_author=@idUser", не связанное с записями таблицы userlink. Была ли у кого-нибудь раньше подобная задача, как такой запрос будет отрабатывать с 1000 друзей, с 10000 избранными записями и 50000 событий?
24 авг 12, 07:39    [13058211]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
ksv55,

думаю, это будет работать дольше, чем джоин
24 авг 12, 07:40    [13058214]     Ответить | Цитировать Сообщить модератору
 Re: Как будет отрабатывать такой запрос?  [new]
aleks2
Guest
Limonad
aleks2,

Спасибо за ответ.

Добавлю немного еще нюанс:



Извини, дарагой, но я тя направил на путь истинный. А дальше копай сам...

OR - зло, ведущее к сканированию таблицы и тормозам.
24 авг 12, 08:09    [13058241]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить