Разделенный вид не работает
Я пытаюсь заставить работать многораздельные представления и все еще вижу, как оптимизатор запросов сканирует обе таблицы. Вот мой сценарий:
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.