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

Откуда:
Сообщений: 21
День добрый, уважаемые знатоки! В очередной раз нужна Ваша консультация, задача следующая, имеем набор из 3 таблиц (см. вложение).
Таблица свойств хранит имена свойств и их ID. Ключом является поле ID.
Таблица документов хранит все документы и их ID. Ключом является поле ID.
Таблица значений свойств хранит все свойства всех документов. Строки свойств имеют внешние ключи, отмеченные цветом. Особенность данной таблицы в точ, что она хранит все версии значений свойств, однако в таблице докуметов не указана последняя версия документа.

Запрос то простой и я его написал, но в виду того, что свойств (следовательно и количество столбцов в конечной таблице) может быть значительное количество, то натолкнулся на вопрос оптимизации и времени выполнения запроса. Однако количество свойств всегда больше чем столбцов, т.е. некоторые свойства мы не выводим.

Сейчас мой запрос построен таким образом:

declare @Var_1 as int = (select VarID from Var where VarName = 'Наименование')
declare @Var_2 as int = (select VarID from Var where VarName = 'Отдел')
declare @Var_3 as int = (select VarID from Var where VarName = 'Группа')

select Doc.DocID
, Doc.DocName
, VT1.Value as [Наименование]
, VT2.Value as [Отдел]
, VT3.Value as [Группа]
from Doc
left join ValueTab VT1 on VT1.DocID = Doc.DocID
and VT1.VarID = @Var_1
and VT1.RevisionNo =
(select MAX (ValueRev) ValueRev
from ValueTab
where DocID = Doc.DocID and VarID = @Var_1)
left join ValueTab VT2 on VT2.DocID = Doc.DocID
and VT2.VarID = @Var_2
and VT2.RevisionNo =
(select MAX (ValueRev) ValueRev
from ValueTab
where DocID = Doc.DocID and VarID = @Var_2)
left join ValueTab VT3 on VT3.DocID = Doc.DocID
and VT3.VarID = @Var_3
and VT3.RevisionNo =
(select MAX (ValueRev) ValueRev
from ValueTab
where DocID = Doc.DocID and VarID = @Var_3)

Лично меня смущает то, что при росте количества необходимых свойств, количество join-ов увеличивается и утяжеляет запрос.
Очень хотелось бы услышать Ваши предложения по оптимизации.

К сообщению приложен файл. Размер - 106Kb
17 дек 13, 16:06    [15305919]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса, вывод множества свойств в одну строку для документа.  [new]
sdet
Member

Откуда:
Сообщений: 463
Davulcu,
Смотрите в сторону pivot/unpivot
17 дек 13, 16:17    [15306027]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса, вывод множества свойств в одну строку для документа.  [new]
AlexandrPlus
Member

Откуда:
Сообщений: 7887
sdet
Davulcu,
Смотрите в сторону pivot/unpivot


или если это нужно только для отчетности,
то это в генераторах отчетов называется - CrossTab-отчет и во всех
генераторах есть Wizard-ы, конструирующие такие отчеты
17 дек 13, 17:07    [15306506]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса, вывод множества свойств в одну строку для документа.  [new]
Cygapb-007
Member

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

сначала, как в Выборка по паре уникальных значений, отбираете последнюю версию каждого значения свойства, затем либо динамический PIVOT, либо обработать непосредственно в клиенте.
17 дек 13, 17:08    [15306510]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в оптимизации запроса, вывод множества свойств в одну строку для документа.  [new]
Davulcu
Member

Откуда:
Сообщений: 21
Cygapb-007,

Спасибо! Интересное решение!
20 дек 13, 20:19    [15325588]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить