У меня есть хранилище данных, содержащее типичные звездные схемы, и целый набор кода, который делает такие вещи (очевидно, намного больше, но это иллюстративно):
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 в разных фактах и измерениях получат оптимизирован, так как вид будет через всю звезду, а просмотры нельзя параметризовать (мальчик, было бы круто!)
Итак, мои вопросы -
Нормален ли этот подход, или это будет просто абстракция, которая снижает производительность и не дает мне ничего, кроме гораздо более приятного синтаксиса?
Как лучше всего создать код для этих представлений, исключив повторяющиеся имена столбцов (даже если представление позже потребуется настроить вручную), учитывая, что все соответствующие PK и FK находятся на своих местах? Должен ли я просто написать некоторый SQL, чтобы вытащить его из INFORMATION_SCHEMA, или уже есть хороший пример.
Редактировать: Я протестировал его, и производительность кажется такой же, даже на более крупных процессах - даже при объединении нескольких звезд, каждая из которых использует эти представления.
Автоматизация происходит главным образом потому, что в хранилище данных есть несколько таких звезд, а FK / PK был выполнен дизайнерами должным образом, но я не хочу, чтобы вам приходилось перебирать все таблицы или документацию. Я написал сценарий для генерации представления (он также генерирует сокращения для таблиц), и он хорошо работает для автоматического создания скелета из INFORMATION_SCHEMA, а затем его можно настроить перед фиксацией создания представления.
Если кому-то нужен код, я, наверное, могу опубликовать его здесь.


Превратите представление или представления в одну или несколько сводных таблиц фактов и материализуйте их. Их нужно обновлять только при обновлении основной таблицы фактов. Материализованные представления будут быстрее запрашивать, и это может быть преимуществом, если у вас есть много запросов, которые можно удовлетворить с помощью сводки.
Вы можете использовать словарь данных или представления информационной схемы для генерации SQL для создания таблиц, если у вас есть большое количество этих сводок или вы хотите часто изменять их.
Однако я бы предположил, что вы вряд ли будете менять их очень часто, поэтому автоматическое создание определений представлений может не стоить проблем.
Не сплющивает, не скручивает. Если вы собираете данные, вам следует подумать о материализации представлений. Так будет быстрее.
Все разные запросы делают разные вещи - это будет только базовый вид звезды без какой-либо аналитической интерпретации, которая будет полезна для устранения повторяющихся копий-вставок, исследования и создания абстракции, в которой вид может также исправить неровности в модели.
Я использовал эту технику в нескольких хранилищах данных, за которыми я ухаживаю. Я не заметил какого-либо снижения производительности при запуске отчетов на основе представлений по сравнению с прямым подходом к таблицам, но никогда не выполнял подробный анализ.
Я создавал представления с помощью конструктора в студии управления SQL Server и не использовал никаких автоматических подходов. Я не могу представить, чтобы схема менялась достаточно часто, чтобы автоматизировать ее в любом случае. Вы можете потратить столько же времени на настройку результатов, сколько на перетаскивание всех таблиц в представление в первую очередь!
Чтобы устранить двусмысленность, рекомендуется поставить перед именами столбцов имя измерения, которому он принадлежит. Это полезно для составителей отчетов и для всех, кто выполняет специальные запросы.
Если вы используете MS SQL Server, вы можете попробовать встроенный UDF, который максимально приближен к параметризованный вид.
Встроенные функции табличного значения отлично подходят для того, чтобы требовать от вызывающей стороны предоставления ограничений по дате, что отлично подходит для сценария использования DW.
Я не слежу за этим - если я свожу всю звезду в таблицу, индексируемую по-другому, в чем вообще был смысл размерной модели?