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