Приклад денормалізації списку

Другий приклад курсора в дії вирішує задачу денормалізації списку Нам потрібно отримати з дат турів Outer Banks Lighthouses розділений комами список значень у вигляді одного рядка

Курсор проходить по всіх датах турів, при цьому в циклі WHILE всі дати додаються в локальну змінну @ EventDates Бітова локальна змінна @ SemiColon визначає, чи потрібен між датами роздільник у вигляді крапки з комою Наприкінці пакета інструкція SELECT повертає денормалізованний список дат

USE СНА2 DECLARE

@EventDates VARCHAR(1024),

@EventDate DATETIME,

©Semicolon BIT SET @Semicoion = 0 SET @EventDates = ‘

DECLARE cEvent CURSOR FAST_FORWARD FOR SELECT DateBegin FROM Event JOIN Tour

ON EventTourlD = TourTourlD WHERE Tour[Name] = Outer Banks Lighthouses

OPEN cEvent

FETCH cEvent INTO @ EventDate – Підготовка курсора WHILE @ @ Fetch_Status = 0 BEGIN

IF @Semicolon = 1 SET @EventDates

= @EventDates +

+ Convert(VARCHAR(15), @EventDate, 107 )

ELSE

BEGIN

SET ©EventDates

= Convert(VARCHAR(15), ©EventDate,107 )

SET @SEMICOLON = 1 END

FETCH cEvent INTO @ EventDate – до наступного рядка END

CLOSE cEvent DEALLOCATE cEvent

SELECT @EventDates

Буде отримано наступний результат:

Feb 02, 2001 Jun Про, 2001 Jul 03, 2001 Aug 17, 2001

Oct 03, 2001 Nov 16, 2001

Курсор з легкістю впорався із завданням денормалізації списку, і в майбутньому він може виявитися вам корисним Водночас пакетне рішення, що використовує технологію змінної з безліччю присвоєнь і продемонстроване в наступному прикладі, працює в десяток разів швидше і може бути використане для більш інтенсивних завдань

Додаткова Детально про змінних з безліччю присвоєнь см в главі 18

інформація

У пропонованому прикладі внутрішній подзапрос повертає список зовнішнім запитом, який, у свою чергу, додає кожен отриманий результат в змінну @ EventDates:

USE СНА2 DECLARE

@EventDates VARCHAR(1024)

SET @EventDates = 1

SELECT @EventDates = @EventDates

+ CONVERT(VARCHAR(15), ad,107 ) + ;’

FROM (select DateBegin as [d] from Event join Tour

on EventTourlD = TourTourlD

WHERE Tour[Name] = Outer Banks Lighthouses) as a SELECT Left(@EventDates, Len(@EventDates)-1)

AS Outer Banks Lighthouses Events’

Буде отримано наступний результат:

Outer Banks Lighthouses Events

Feb 02, 2001 Jun 06, 2001 Jul 03, 2001 Aug 17, 2001

Oct 03, 2001 Nov 16, 2001

Резюме

Коли оптимізація збільшує продуктивність в десятки разів (від годин виконання – у хвилини, від хвилин – в секунди), тоді виконана робота приносить задоволення Не існує кращого способу оптимізації збереженої процедури, чим замінити непотрібний курсор Якщо ви шукаєте якийсь дуже низько продуктивний продукт, тоді курсор – саме те, що вам потрібно

Дозвольте процитувати мого друга Білла Вона: Курсор придумав диявол” До цього мені нічого додати Будь курсор працює до безумства повільно Непотрібні курсори входять в мій список пяти найбільш важливих проблем продуктивності SQL Server Кращий спосіб налаштувати курсор – це повністю замінити його елегантним пакетним запитом

У наступному розділі ми візьмемо на озброєння все, про що дізналися в попередніх розділах, і будемо вбудовувати пакети в збережені процедури

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*