2014-11-04 3 views
0

Я работаю над проектом SSIS для создания хранилища данных.Каков наилучший способ обновить вычисленный производный столбец при медленном обновлении размеров?

Вот мой простой процесс SSIS, созданный для загрузки таблицы измерений (местоположения). Таблица местоположений содержит родительскую/дочернюю структуру на основе вложенных множеств (поля ВЛЕВО, ВПРАВО, УРОВЕНЬ). Итак, процесс вставки работает, а также процесс обновления.

enter image description here

Тем не менее, мне нужно, чтобы заполнить вычисляемый столбец (parent_id) для того, чтобы хранить родительские отношения. Итак, для каждой строки мне нужно использовать столбцы LEFT, RIGHT и LEVEL в инструкции SQL, чтобы найти значение PARENT_ID).

Это таблица структуры таблицы источника: enter image description here

Так что это лучший способ, чтобы заполнить мою колонку parent_id во время процесса загрузки? Должен ли я создать выделенный поток данных для этого процесса?

Можно ли использовать оператор SQL в компоненте Derived column, чтобы найти значение parent_id?

EDIT: Вот мой SQL-запрос для обновления родительской/дочерней структуры (родительского поля).

UPDATE 
    L1 
    SET L1.[PARENT_ID] = (
    SELECT TOP 1 L2.ID 
      FROM [DW].[DimLocation] L2 
      WHERE L2.[TREE_LEFT_VALUE] < L1.[TREE_LEFT_VALUE] AND L2.[TREE_RIGHT_VALUE] > L1.[TREE_RIGHT_VALUE]  
      ORDER BY L2.[TREE_RIGHT_VALUE]-L1.[TREE_RIGHT_VALUE] ASC) 
FROM [DW].[DimLocation] L1 
WHERE [TREE_LEFT_VALUE] > 1 

EDIT 2: Вот схема, чтобы представить структуру вложенных множеств, и как представить его в базу данных. enter image description here enter image description here

Таким образом, каждый узел содержит TREE_LEFT_VALUE и TREE_RIGHT_VALUE значения, которые, соответственно, связанные их Чайлдс TREE_LEFT_VALUE/TREE_RIGHT_VALUE значения.

Это сделано для простого запроса всех дочерних узлов указанного узла. Например, если я хочу, чтобы все дети узла «ROOT 1», я должен запросить все узлы, где TREE_LEFT_VALUE больше 2 и TREE_RIGHT_VALUE менее 5.

Потому что мне нужно использовать parent_id структуру в моем хранилище данных (проект SSAS для создания куба OLAP), мне нужно обновить поле PARENT_ID, добавив идентификатор родительского узла. Поэтому мне нужно запросить идентификатор родительского узла, используя поля TREE_LEFT_VALUE и TREE_RIGHT_VALUE, а затем использовать результат в инструкции обновления.

Он отлично работает, но есть ли более эффективный способ сделать это?

Спасибо,

ответ

2

Если столбец обнуляемый, я бы обновить его с помощью SQL задачи после вашего потока данных. Это гарантирует, что все возможные родительские строки будут вставлены до того, как вы попытаетесь найти родительский элемент. Кроме того, это будет зависеть от набора параметров процесса, а не пытается сделать это с помощью поиска в задаче потока данных.

+0

Я добавил свой SQL-запрос для обновления родительского поля. Он отлично работает, но есть ли более эффективный способ сделать это? – K4timini

+0

Я не уверен, что я правильно понимаю структуру таблицы, чтобы ответить на этот вопрос. В идеале у вас не будет подзапроса, чтобы получить значение для каждой строки. Это определенно собирается замедлить его.Если вы предоставляете структуру таблицы и объясняете, как записи относятся друг к другу более явно, это поможет. то есть я не знаю, что именно имеет значение Tree_left_value. –

+0

Надеюсь, мое второе редактирование поможет вам понять мою проблему. – K4timini