Допустим, у нас есть 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, это было бы скорее прямым предварительным выбором только данных искомого столбца.
Комментарии?