Медленно формируется отчет

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Ответить
Аватара пользователя
Maestro
Новый участник
Сообщения: 6
Зарегистрирован: 24 фев 2009, 15:56
Используемое ПО: Lotsia PDM PLUS
Откуда: г. Нижневартовск
Контактная информация:

Медленно формируется отчет

Сообщение Maestro »

Здраствуйте...
Lotsia PDM Plus ver. 4.30
Имеется отчет отображающий входящие документы:
Глубина поиска: Вся база данных
Тип отбора:Отбор по условиям отчета
Разделы: 1 раздел -> Подчиненная
Ограничение по типу объекта: Тип объекта=Документ
Сортировки: Нет
Атрибуты: Тип документа="Входящий"
Отчет:14 атрибутов различных типов+2 вычисляемых поля(одно показывает номер строки, второе из атрибута "номер документа" вырезает непосредственно номер...отчет сортируется по этому вычисляемому полю(тип число) )
Фильтр: имеется фильтр по аргументам
*********
col3 >= nach and col3 <= finish and ( lower(col6) like if (IsNull( autor ) or autor = '', '%', '%'+ lower(autor) +'%')) and (lower(col2) like if (IsNull(Docnum) or Docnum = '', '%', '%'+lower(DocNum)+'%') ) and (lower(col4) like if (IsNull(KontrNumber) or KontrNumber = '', '%', '%'+lower(KontrNumber)+'%') ) and (lower(col7) like if (IsNull(soder) or soder = '', '%', '%'+lower(soder)+'%')) and (lower(col5) like if (IsNull( kontr ) or kontr = '', '%', '%'+ lower(kontr) +'%')) and (lower(col11) like if (IsNull( status ) or status = '', '%', '%'+ lower(status) +'%'))
*********
по умолчанию срабатывает только фильтр "col3 >= nach and col3 <= finish " ограничивая дату регистрации документов текущим годом.
отчет формируется от 40 сек до 1 минуты взависимости от мощности компьютера.
если убрать вычисляемое поле вырезающее номер отчет строится быстрее на 10 сек, но кардинально это ситуации не улучшает.
количество объектов в базе: 16345
количество объектов типа "документ":3623
отчет выбирает 365 строк.
.......
подскажите что можно сделать, чтобы отчет формировался быстрее. Приемлимым считаю формирование такого отчета за 5-10 сек.
Буду признателен за любую помощь. Спасибо.
Аватара пользователя
Maestro
Новый участник
Сообщения: 6
Зарегистрирован: 24 фев 2009, 15:56
Используемое ПО: Lotsia PDM PLUS
Откуда: г. Нижневартовск
Контактная информация:

Re: Медленно формируется отчет

Сообщение Maestro »

В общем решение удалось найти самостоятельно, а именно построить пользовательский отчет.
Я не большой спец в SQL и у меня получился такой вот запрос:
select O_R.id as isobject_id ,O_R.description as Name
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000003400001' ) as TP
,(select VDT1.value from lsdbo.attrib_value_view AV1,lsdbo.value_datetime_view VDT1
where O_R.id=AV1.object_ID and VDT1.id=AV1.value_id and AV1.attrib_id ='100000003100001' ) as DT_reg
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='11' ) as isp
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000063000001' ) as kontr
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000002100001' ) as number
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='-30' ) as soder
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000063100001' ) as Autor
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000063400001' ) as res
,(select VDT1.value from lsdbo.attrib_value_view AV1,lsdbo.value_datetime_view VDT1
where O_R.id=AV1.object_ID and VDT1.id=AV1.value_id and AV1.attrib_id ='100000063300001' ) as srok_isp
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000056700001' ) as KontrNumber
,(select VDT1.value from lsdbo.attrib_value_view AV1,lsdbo.value_datetime_view VDT1
where O_R.id=AV1.object_ID and VDT1.id=AV1.value_id and AV1.attrib_id ='100000065000001' ) as DT_KontrNumber
,(select VS1.value from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1
where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000044500001' ) as status
,(select VDT1.value from lsdbo.attrib_value_view AV1,lsdbo.value_datetime_view VDT1
where O_R.id=AV1.object_ID and VDT1.id=AV1.value_id and AV1.attrib_id ='100000003200001' ) as Dt_finish
from lsdbo.object_reference_view O_R
where O_R.type_id='100000003000001'
order by DT_reg Desc

где в каждом подзапросе строка
AV1.attrib_id ='100000044500001'
это код выбираемого атрибута, а строка
where O_R.type_id='100000003000001'
это тип выбираемых объектов

так же в отчете сделал тот же фильтр по аргументам. он, как оказалось, вообще не влияет на скорость формирования отчета.
теперь вместо 50 сек отчет формируется за 10-11.
....
PS если у кого есть предложения по оптимизации этого решения, то прошу в студию :-)
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Медленно формируется отчет

Сообщение Александр »

Код: Выделить всё

select O_R.id as isobject_id,
       O_R.description as Name,
       (select VS1.value 
          from lsdbo.attrib_value_view AV1,lsdbo.value_string_view VS1 
         where O_R.id=AV1.object_ID and VS1.id=AV1.value_id and AV1.attrib_id ='100000003400001' ) as TP,
       (select VDT1.value 
          from lsdbo.attrib_value_view AV1,lsdbo.value_datetime_view VDT1 
         where O_R.id=AV1.object_ID and VDT1.id=AV1.value_id and AV1.attrib_id ='100000003100001' ) as DT_reg
  from lsdbo.object_reference_view O_R
 where O_R.type_id='100000003000001'
 order by DT_reg Desc
=

Код: Выделить всё

SELECT rw.id as isobject_id,
       rw.description as Name, 
       vv1.value as TP,
       vv2.value as DT_reg
  FROM lsdbo.object_reference_view rw left join lsdbo.object_type_view tw on rw.type_id=tw.id left join 
       lsdbo.attrib_value_view av1 on rw.id=av1.object_id and av1.attrib_id=100000003400001 left join 
       lsdbo.value_string_view vv1 on av1.value_id=vv1.id and av1.attrib_id=100000003400001 left join 
       lsdbo.attrib_value_view av2 on rw.id=av2.object_id and av2.attrib_id=100000003100001 left join 
       lsdbo.value_datetime_view vv2 on av2.value_id=vv2.id and av2.attrib_id=100000003100001 
 where rw.type_id = '100000003000001'
 order by vv2.value Desc 

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Maestro
Новый участник
Сообщения: 6
Зарегистрирован: 24 фев 2009, 15:56
Используемое ПО: Lotsia PDM PLUS
Откуда: г. Нижневартовск
Контактная информация:

Re: Медленно формируется отчет

Сообщение Maestro »

Здраствуйте, Александр.

Изучил Ваше предложение. Должен сказать что конструкцией left join пользуюсь очень редко и подобное построение запроса мне просто не пришло в голову.
Я составил точно такой же запрос(с тем же количеством полей) как и в моем отчете и оказалось что конструкция с left join в SQL Managment studio работает почти в три раза дольше... 36 против 13 секунд.
Но в любом случае спасибо за участие. Я долго ломал голову над тем как выбрать одним запросом несколько разнотипных атрибутов, а теперь знаю аж 2 способа.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Медленно формируется отчет

Сообщение Александр »

ну и третий способ ))
сделайте из своего запроса функцию в бд
удалите из запроса все _view
дайте права на функцию группе PartyP
и наслаждайтесь скоростью))

Код: Выделить всё

create  function [LSDBO].[Ric_Get_моя_функция]
        (@TypeID numeric(18,0)=0      	--тип объекта
         )
Returns table
 as
  return
( 
SELECT rw.id as isobject_id,
       rw.description as Name,
       vv1.value as TP,
       vv2.value as DT_reg
  FROM lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id left join
       lsdbo.attrib_value av1 on rw.id=av1.object_id and av1.attrib_id=100000003400001 left join
       lsdbo.value_string vv1 on av1.value_id=vv1.id and av1.attrib_id=100000003400001 left join
       lsdbo.attrib_value av2 on rw.id=av2.object_id and av2.attrib_id=100000003100001 left join
       lsdbo.value_datetime vv2 on av2.value_id=vv2.id and av2.attrib_id=100000003100001
where rw.type_id = @TypeID
)
и вызов из Лоции

Код: Выделить всё

select * from LSDBO.Ric_Get_моя_функция(100000003000001) order by DT_reg Desc
только не увлекайтесь мелкими функциями - лучше на них выстроить свою систему запросов - используя их совместно, а за правами (_view) следить на этапе вызова функций а не в запросе на этапе выборки (_view) как предлагает Лоция

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Медленно формируется отчет

Сообщение Старик Крупский »

Э-э-э...
как предлагает Лоция
Но предложение Александра, вроде как дает юзерам неограниченный доступ к данным, которыми функция наполняет свою табличку, через альтернативные интерфейсы (через тот же Excel, который есть у практически всех). И тут с ограничением доступа можно распрощаться. Это я так, на всякий случай говорю.
Или я не прав?
"Лучше меньше, да лучше" (C)
Ответить