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

Откуда:
Сообщений: 6
Добрый день, вопрос думаю простой но что-то не смог найти ответ на свой вопрос в гугле.

Есть БД, в ней 3 таблицы: User, Address, Street

User
- Id (primary key)
- Name (index)
- AddressId (foreign key)

Address
- Id (primary key)
- Building (index)
- StreetId (foreign key)

Street
- Id (primary key)
- Name (index)

Нужно отсортировать пользователей по двум полям из других таблиц: Address.Building и Street.Name

Индексы по Address.Building и Street.Name построены

т.е. у меня запрос получается такой:
SELECT TOP 100 u.*
  FROM [User] u
  join [Address] a on u.[AddressId] = a.[Id]
  join [Street] s on a.[StreetId] = s.[Id]
  order by s.Name, a.Building


Такой запрос выполняется очень долго, секунд 15. А если убрать одну из сортировок, и оставить либо по номеру дома либо по названию улицы, от отрабатывает мгновенно.

Не могу понять как оптимизировать запрос, или БД чтобы отрабатывало так же быстро как при сортировке по одному полю, вроде же нет особой разницы, не пойму в чем причина тормозов.
8 ноя 13, 12:50    [15096856]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Elast
не пойму в чем причина тормозов.

Смотрите план выполнения
8 ноя 13, 12:55    [15096897]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Elast
Member

Откуда:
Сообщений: 6
Glory, да я смотрел, 90% времени тратиться на операцию sort, в ней написан кусок запроса order by, ну до этого я и сам догадался))
8 ноя 13, 14:06    [15097520]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Elast
ну до этого я и сам догадался))

А вы не догадались, что это означает отсутствие нужного индекса ?
Иначе чего бы серверу просто так сортировать что-то ?
Наверняка в плане "быстро как при сортировке по одному полю, " нет никаких Sort ?
8 ноя 13, 14:09    [15097542]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Гость333
Member

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

Выложите сюда планы выполнения.
8 ноя 13, 14:29    [15097670]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Elast
Member

Откуда:
Сообщений: 6
Glory, да, и правда, если оставить в order by сортировку по одному полю, то в плане выполнения не будет операции sort, этого я не заметил. Но индексы есть по всем полям у каждой таблицы, по полям Id - кластерные и уникальные, по остальным не кластерные и не уникальные. Может нужно создать еще какой-то тип индексов про который я не знаю?
8 ноя 13, 14:35    [15097738]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Elast
Member

Откуда:
Сообщений: 6
Гость333, Вот план выполнения с сортировкой по 2-м полям: ссылка на изображение
Вот план выполнения с сортировкой по одному полю: ссылка на изображение
8 ноя 13, 14:41    [15097808]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Elast
Member

Откуда:
Сообщений: 6
Еще про один момент забыл написать: Street - это вьюшка на таблицу из другой БД, но в этой таблице в другой БД есть все индексы как я и написал.
8 ноя 13, 15:02    [15097979]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Гость333
Member

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

Попробуйте такой запрос:
SELECT TOP 100 *
FROM
(
  SELECT TOP 100 WITH TIES u.*, s.Name as Street_Name, a.Building as Address_Building
  FROM [User] u
  join [Address] a on u.[AddressId] = a.[Id]
  join [Street] s on a.[StreetId] = s.[Id]
  order by s.Name
) t
ORDER BY Street_Name, Address_Building
8 ноя 13, 15:15    [15098072]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать данные по двум полям из других таблиц  [new]
Elast
Member

Откуда:
Сообщений: 6
Гость333, летает!! Спасибо!
8 ноя 13, 15:34    [15098204]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить