Табличная функция [XML Reader] Очень медленно - Альтернативы? - PullRequest
3 голосов
/ 12 августа 2011

У меня есть следующий запрос, который действительно снижает производительность, и я хочу знать, каковы их альтернативы подзапросу чтения XML Цель этого запроса - экспортировать данные с использованием некоторого HTML-кода.

Пример данных таблицы следующий:

  p_s_id | p_c_id | notes
  -----------------------
     1   |   1    | this note is really long.
     2   |   1    | This is fun.
     3   |  null  | long note here 
     4   |   2    | this is not fun
     5   |   2    | this is not fun
     6   |   3    | long note here

Я хочу сделать все заметки с одинаковым p_c_id и соединить их вместе, как показано ниже.

Может быть предоставлена ​​любая дополнительная информация, поэтому не стесняйтесь комментировать.

select distinct
     p_c_id
    ,'<br/><br/>'+(select distinct '&bull; ' +cast(note as nvarchar(max)) + ' <br/> '
      from dbo.spec_notes_join m2
      where m.p_c_id = m2.p_c_id
      and isnull(note,'') <> ''
      for xml path(''), type).value('.[1]', 'nvarchar(max)') as notes_spec
from dbo.spec_notes_join m

, поэтому экспорт будет выглядеть следующим образом:

  p_c_id | notes
 --------------
    1    | <br/><br/> &bull; this note is really long.  <br/> &bull This is fun <br/>
    2    | <br/><br/> &bull; This is not fun.  <br/>
    3    | <br/><br/> &bull; long note here.   <br/>

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Я думаю, что вы получите немного лучшую производительность, пропустив distinct во внешнем запросе и вместо этого сделав group by p_c_id.

select p_c_id,
      '<br/><br/>'+(select distinct '&bull; ' +cast(note as nvarchar(max)) + ' <br/> '
                    from dbo.spec_notes_join m2
                    where m.p_c_id = m2.p_c_id and 
                          isnull(note,'') <> ''
                    for xml path(''), type).value('.', 'nvarchar(max)') as notes_spec
from dbo.spec_notes_join m     
group by p_c_id

Вы также можете попробовать объединение с помощью определяемой пользователем агрегатной функции CLR .

Другие альтернативы можно найти здесь Объединение значений строк в Transact-SQL .

3 голосов
/ 12 августа 2011

Хотя эта альтернатива пропускает XML, я не знаю, улучшает ли он производительность - если бы вы могли тестировать и публиковать результаты в качестве комментария, я бы оценил его.(Это сработало на моем быстром макете, вам может потребоваться выполнить небольшую отладку на ваших собственных структурах.)

Начните с этой функции:

CREATE FUNCTION dbo.Testing
(
    @p_c_id  int
)
RETURNS varchar(max)
AS
 BEGIN
    DECLARE @ReturnString  varchar(max)

    SELECT @ReturnString = isnull(@ReturnString + ' <br/> , <br/><br/>&bull; ', '<br/><br/>&bull; ') + Name
     from (select distinct note
            from spec_notes_join
            where p_c_id = @p_c_id
             and isnull(note, '') <> '') xx

    SET @ReturnString = @ReturnString + ' <br/> '

    RETURN @ReturnString
 END
GO

, а затем вставьте ее в свой запрос:

SELECT p_c_id, dbo.Testing(p_c_id)
 from (select distinct p_c_id
        from dbo.spec_notes_join) xx

Это может плохо работать из-за функции, вызываемой для каждой строки.Возможно, более быстрым вариантом было бы написать функцию как табличную функцию и ссылаться на нее с помощью CROSS APPLY в предложении соединения.

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