Объединение псевдо-разделенных таблиц в одно представление - PullRequest
1 голос
/ 07 октября 2011

Допустим, у нас есть 5 таблиц

Fact_2011
Fact_2010
Fact_2009
Fact_2008
Fact_2007

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

Затем мы создадим отдельный индекс для каждой из этих таблиц со столбцом «Год» в качестве первого столбца индекса.

Наконец, мы создаем представление vwFact, котороеобъединение всех таблиц:

SELECT * FROM Fact_2011
UNION
SELECT * FROM Fact_2010
UNION
SELECT * FROM Fact_2009
UNION
SELECT * FROM Fact_2008
UNION
SELECT * FROM Fact_2007

и выполнение таких запросов:

SELECT * FROM vwFact WHERE YEAR = 2010

или, в менее вероятных ситуациях,

SELECT * FROM vwFact WHERE YEAR > 2010 

Какэффективны ли эти запросы по сравнению с фактическим разделением данных по годам или по сути то же самое?Имеет индекс по Year для каждой из этих псевдоразделенных таблиц, что необходимо для того, чтобы механизм SQL не тратил больше тривиального времени на определение того, что физическая таблица, содержащая записи за пределами искомого диапазона дат, не стоитсканирование?Или этот подход псевдоразделения в точности совпадает с тем, что делает MS (по годам)?

Мне кажется, что если выполняемый запрос будет

SELECT Col1Of200 FROM vwFact WHERE YEAR = 2010 

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

Комментарии?

1 Ответ

3 голосов
/ 07 октября 2011

Я успешно реализовал секционированные представления в SQL Server 2000

Убедитесь, что , что у вас есть проверочное ограничение для каждой таблицы, которое будет ограничивать столбец года годом.Таким образом, для таблицы Fact_2010 это будет Check Year = 2010

, затем также создайте представление UNION ALLs, а не UNION

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

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

, что реальное разбиение будетимеют явное преимущество, потому что псевдоразделение сначала должно выполнить представление, чтобы извлечь все столбцы из таблицы Fact_2010, а затем отфильтровать до одного столбца, который конечный пользователь выбирает

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

...