Разделенный вид не работает

Я пытаюсь заставить работать многораздельные представления и все еще вижу, как оптимизатор запросов сканирует обе таблицы. Вот мой сценарий:

CREATE TABLE A(DataDate [date] NOT NULL CHECK(datepart(yy, DataDate) <= 2010)) 

CREATE TABLE B(DataDate [date] NOT NULL CHECK(datepart(yy, DataDate) > 2010))

CREATE VIEW V AS SELECT * FROM A UNION ALL SELECT * FROM B 

select * from V where datepart(yy, DataDate) = 2009

Но когда я смотрю на план выполнения, я вижу, что таблица A и таблица B были отсканированы, и "Число выполнений" для обеих таблиц равно 1. Я ожидаю, что таблица A будет иметь Number of Executions = 1и таблица B иметь Number of Executions = 0, Я на SQL Server 2012,

Может кто-нибудь уточнить, как это должно работать? Спасибо.

2 ответа

Решение

Должен работать так:

CREATE TABLE A(DataDate [date] NOT NULL CHECK(DataDate < '20110101'));

CREATE TABLE B(DataDate [date] NOT NULL CHECK(DataDate >= '20110101'));
go

CREATE VIEW V AS SELECT * FROM A UNION ALL SELECT * FROM B 
go

select * from V where DataDate >= '20090101' and DataDate < '20100101';
go

Из документации в CREATE VIEW, о секционированных представлениях, при обсуждении ограничений, которые должны существовать в базовых таблицах:

Ограничение C1, определенное в таблице T1, должно иметь следующую форму:

C1 ::= < simple_interval > [ OR < simple_interval > OR ...]
< simple_interval > :: = 
< col > { < | > | <= | >= | = < value >} 
| < col > BETWEEN < value1 > AND < value2 >
| < col > IN ( value_list )
| < col > { > | >= } < value1 > AND
< col > { < | <= } < value2 >

Ваши ограничения не имеют этой формы, и поэтому не может быть разделенным представлением. Вам нужны простые ограничения, такие как те, которые показывал @Remus, а не те, которые вызывают функции.


И, конечно же, другой совет, который вы найдете в любом месте, где вы просматриваете разделенные виды в BOL:

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

Секционированные таблицы были предпочтительным методом разбиения с момента их появления в SQL Server 2005.

Другие вопросы по тегам