Объединение баз данных - PullRequest
       15

Объединение баз данных

3 голосов
/ 01 декабря 2009

Данные моего хранилища datamart разделены на 3 базы данных на одном сервере. Это проверенный на практике проект с тремя выдержками, которые были загружены в отдельные базы данных.

Потянув в куб, я, по сути, делаю это:

SELECT * FROM DB1.dbo.Fact_Pres
UNION
SELECT * FROM DB2.dbo.Fact_Pres
UNION
SELECT * FROM DB3.dbo.Fact_Pres

Должен ли я на самом деле объединить данные в одну таблицу? Это ускорит мою обработку?

У меня нет проблем с дисковым пространством - я хочу реализовать лучшее решение.

В любом случае, можете ли вы помочь мне понять, почему предложенный вами метод был бы оптимальным?

Ответы [ 4 ]

3 голосов
/ 01 декабря 2009

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

Но зачем иметь несколько баз данных? Вы всегда можете объединить три таблицы в одну таблицу, но при этом одна таблица будет реализована на трех дисках, соединенных вместе Это более четкое решение, если вам нужна скорость.

Объединение имеет смысл только в том случае, если вы выбираете конкретные смежные части набора. Но, согласно вашему ОП, вы выбираете все, что исключает эту выгоду.

3 голосов
/ 01 декабря 2009

Да, вы определенно должны. Нет смысла разбивать одну и ту же таблицу на разные базы данных. Если у вас есть проблемы с пространством на жестком диске, подумайте о разбиении таблицы.

По поводу вашего комментария:

Производительность невелика, но объединение выполняет объединение слиянием, что приводит к небольшим накладным расходам.

Кроме того, вы уверены, что используете UNION правильно? UNION устранит повторяющиеся значения. Может быть, то, что вы действительно хотите сделать, это UNION ALL?

2 голосов
/ 01 декабря 2009

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

Когда дело доходит до ETL, предлагается сделать ETL в промежуточных таблицах в отдельной схеме - например, ETL - в одной и той же БД и загрузить оттуда таблицу фактов. После этого вы усекаете промежуточные таблицы.

Рекомендации взяты из Microsoft Project Real .

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

1 голос
/ 01 декабря 2009

A UNION, по сути, выполняет select distinct, так что он может удалять дубликаты записей. Это (потенциально) ухудшит производительность само по себе. Вы можете исправить это, изменив его на UNION ALL.

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

...