Запрос на получение медленных параметров отчета SSRS и параметров раскрывающегося списка - PullRequest
0 голосов
/ 15 мая 2019

Мне нужно получить список параметров для конкретного отчета SSRS и показать все возможные выпадающие элементы (вместе с именем параметра Report, DataType и Prompt).

Я не уверен в других вариантах (если они есть). Запрос возвращает именно то, что мне нужно, он занимает слишком много времени, чтобы быть полезным (10-12 секунд). Есть ли другой способ получить эти результаты или сделать этот быстрее?

USE ReportServer
DECLARE @dbname VARCHAR(25)
SET @dbname='DBName'
DECLARE @rptlistStr VARCHAR(MAX)
DECLARE @reportlist table ( path varchar(500), name varchar(500) )
insert into @reportlist
exec [ADA Master].[dbo].[spGetAdminReports] @dbname

set @rptlistStr = substring((SELECT ( ', ' + Name ) FROM @reportlist WHERE NAME = 'rptReport'
FOR XML PATH( '' )
), 3, 1000 )          


SELECT NAME, PATH,
y.r.query ('for $s in *:ParameterValue/*:Value return concat(data($s),"|")') [DropDownItemValue]    
, y.r.query ('for $s in *:ParameterValue/*:Label return concat(data($s),"|")') [DropDownItemLabel]      
, x.r.value ('@Name', 'VARCHAR(100)') AS ReportParameterName
, x.r.value ('*:DataType[1]', 'VARCHAR(100)') AS DataType
, x.r.value ('*:AllowBlank[1]', 'VARCHAR(50)') AS AllowBlank
, x.r.value ('*:Prompt[1]', 'VARCHAR(100)') AS Prompt
, x.r.value ('*:Hidden[1]', 'VARCHAR(100)') AS Hidden
, x.r.value ('*:MultiValue[1]', 'VARCHAR(100)') AS MultiValue
FROM (
SELECT  PATH
, NAME
, CAST(CAST(content AS VARBINARY(MAX)) AS XML) AS ReportXML 
FROM ReportServer.dbo.Catalog 
join master.dbo.ufn_SplitStringArray(@rptlistStr,',') a on NAME COLLATE DATABASE_DEFAULT = a.Item COLLATE DATABASE_DEFAULT
WHERE CONTENT IS NOT NULL AND TYPE = 2
) C
CROSS APPLY C.ReportXML.nodes('*:Report/*:ReportParameters/*:ReportParameter') x(r) 
OUTER APPLY x.r.nodes('*:ValidValues/*:ParameterValues') y(r) 
where x.r.value ('*:Prompt[1]', 'VARCHAR(100)') is not null 

1 Ответ

0 голосов
/ 15 мая 2019

В первую очередь - я бы не стал напрямую запрашивать ReportServer.dbo.Catalog; люди делают это все время, и это безумие. Преобразование данных img в VARNBINARY (MAX), а затем в XML, безумно дорого. Если вам часто нужна эта информация, я предлагаю перенести результаты этого запроса в другую таблицу (мы назовем ее «SSRS_RDL»), а затем, как часть вашего процесса развертывания отчетов, вы бы обновите SSRS_RDL с изменениями и новыми записями по мере необходимости. Даже почасовой работы, которая делает это, часто будет достаточно. Таким образом, вы имеете дело с реляционными данными, которые легко индексируются и могут быть получены в 1000 раз быстрее, чем вы делаете это сейчас.

Это говорит о том, что у вас серьезный недостаток дизайна с вашим кодом; Вы:

  1. выполнение [ADA Master]. [Dbo]. [SpGetAdminReports] для вставки строк в таблицу @reportlist
  2. затем с помощью XML PATH превратить @reportlist в строку с именем @ rptlistStr
  3. Затем с помощью dbo.ufn_SplitStringArray превратить @rptlistStr обратно в таблицу
  4. Присоединение результатов этой таблицы к ReportServer.dbo.Catalog

Вы можете избавиться от @rptlistStr и кода для его заполнения из @reportList и вместо этого присоединить свою таблицу @reportlist к ReportServer.dbo.Catalog. Другими словами, измените:

FROM ReportServer.dbo.Catalog AS c
JOIN master.dbo.ufn_SplitStringArray(@rptlistStr,',') a on NAME COLLATE DATABASE_DEFAULT = a.Item COLLATE DATABASE_DEFAULT

Кому:

FROM ReportServer.dbo.Catalog AS c
JOIN @reportlist AS a ON on c.Name COLLATE DATABASE_DEFAULT = a.name COLLATE DATABASE_DEFAULT

И наконец:

Этот запрос будет выполняться намного быстрее с планом параллельного выполнения. После того, как вы внесли изменения, которые я только что изложил, рассмотрите возможность использования OPTION (QUERYTRACEON 8649) в конце вашего последнего запроса SELECT (или использования Make_Parallel () Адама Мачаника.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...