Типичное хранилище данных по звездной схеме Кимбалла — возможно ли представление модели? и как генерировать код

У меня есть хранилище данных, содержащее типичные звездообразные схемы, и целую кучу кода, который делает подобные вещи (очевидно, намного больше, но это иллюстративно):

SELECT cdim.x
    ,SUM(fact.y) AS y
    ,dim.z
FROM fact
INNER JOIN conformed_dim AS cdim
    ON cdim.cdim_dim_id = fact.cdim_dim_id
INNER JOIN nonconformed_dim AS dim
    ON dim.ncdim_dim_id = fact.ncdim_dim_id
INNER JOIN date_dim AS ddim
    ON ddim.date_id = fact.date_id
WHERE fact.date_id = @date_id
GROUP BY cdim.x
    ,dim.z

Я думаю заменить его представлением (скажем, MODEL_SYSTEM_1), чтобы оно стало:

SELECT m.x
    ,SUM(m.y) AS y
    ,m.z
FROM MODEL_SYSTEM_1 AS m
WHERE m.date_id = @date_id
GROUP BY m.x
    ,m.z

Но представление MODEL_SYSTEM_1 должно содержать уникальные имена столбцов, и меня также беспокоит производительность оптимизатора, если я продолжу и сделаю это, потому что я обеспокоен тем, что все элементы в предложении WHERE для разных фактов и измерений получат оптимизирован, так как вид будет через всю звезду, а виды нельзя параметризовать (боже, как бы это было круто!)

Итак, мои вопросы -

  1. Подходит ли этот подход, или это просто абстракция, которая снижает производительность и не дает мне ничего, кроме более приятного синтаксиса?

  2. Каков наилучший способ сгенерировать код для этих представлений, устранив повторяющиеся имена столбцов (даже если представление позже нужно будет настроить вручную), учитывая, что все соответствующие PK и FK на месте? Должен ли я просто написать какой-нибудь SQL, чтобы вытащить его из INFORMATION_SCHEMA, или уже есть хороший пример.

Редактировать: я протестировал его, и производительность кажется такой же, даже в более крупных процессах — даже при объединении нескольких звездочек, каждая из которых использует эти представления.

Автоматизация в основном связана с тем, что в хранилище данных есть несколько таких звездочек, а FK/PK были выполнены дизайнерами должным образом, но я не хочу просматривать все таблицы или документацию. Я написал скрипт для создания представления (он также генерирует сокращения для таблиц), и он хорошо работает для автоматического создания скелета из INFORMATION_SCHEMA, а затем его можно настроить перед фиксацией создания представления.

Если кому-то нужен код, я, вероятно, мог бы опубликовать его здесь.


person Cade Roux    schedule 24.09.2008    source источник


Ответы (3)


  1. Я использовал эту технику в нескольких хранилищах данных, за которыми я ухаживаю. Я не заметил какого-либо снижения производительности при запуске отчетов на основе представлений по сравнению с прямым подходом к таблице, но никогда не проводил детальный анализ.

  2. Я создал представления с помощью дизайнера в студии управления SQL Server и не использовал никакого автоматизированного подхода. Я не могу себе представить, чтобы схема менялась настолько часто, что ее автоматизация в любом случае стоила бы смысла. Вы можете потратить на настройку результатов столько же времени, сколько потребовалось бы, чтобы перетащить все таблицы в представление!

Чтобы устранить двусмысленность, хорошим подходом является предварение имен столбцов именем измерения, к которому они принадлежат. Это полезно для составителей отчетов и для всех, кто выполняет специальные запросы.

person Brad_Z    schedule 25.09.2008

Превратите представление или представления в одну или несколько сводных таблиц фактов и материализуйте их. Их нужно обновлять только при обновлении основной таблицы фактов. Материализованные представления будут быстрее выполнять запросы, и это может быть преимуществом, если у вас есть много запросов, которые могут быть удовлетворены сводкой.

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

Однако я предполагаю, что маловероятно, что вы будете менять их очень часто, поэтому автоматическая генерация определений представлений может не стоить проблем.

person ConcernedOfTunbridgeWells    schedule 24.09.2008
comment
Я не слежу за этим - если я сплющиваю всю звезду в таблицу, индексированную по-другому, в чем вообще смысл многомерной модели? - person Cade Roux; 24.09.2008
comment
Не сплющивается, сворачивается. Если вы сворачиваете данные, вам следует подумать о материализации представлений. Это будет быстрее. - person ConcernedOfTunbridgeWells; 24.09.2008
comment
Все разные запросы делают разные вещи - это будет только базовое представление звезды без какой-либо аналитической интерпретации, которая была бы полезна для устранения повторяющихся копий-вставок, исследований и допуска абстракции, где представление также могло бы исправить неровности в модели. - person Cade Roux; 25.09.2008

Если вы используете MS SQL Server, вы можете попробовать Inline UDF, который максимально близок к параметризованное представление по мере его получения.

person Damir Sudarevic    schedule 26.10.2009
comment
Встроенные функции табличных значений отлично подходят для требования, чтобы вызывающая сторона предоставляла ограничения даты, что отлично подходит для сценария использования DW. - person Cade Roux; 26.10.2009