Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ещё вопрос про вставку в partitioned view  [new]
SergASh
Member

Откуда:
Сообщений: 167
Привет всем,

Пытаясь прикрутить partitioned views к своей базе уперся в ограничение на количество таблиц, которые можно упомянуть в запросе. 256 слишком мало для моего случая. Очевидный выход - сделать view более высокого уровня, в котором будут объединяться выборки из других view. Для выборки все работает и оптимизатор выбирает нужную таблицу для двух- и даже для трехуровневой схемы. Но вот со вставкой проблема.

Итак, имеем вот такие таблицы
create table tblLeaf1
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'USCN' )
)
create table tblLeaf2
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'USJP' )
)
create table tblLeaf3
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'DECN' )
)
create table tblLeaf4
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'DKCN' )
)

create table tblLeaf5
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'CNUS' )
)
create table tblLeaf6
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'CNGB' )
)
create table tblLeaf7
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'CNNO' )
)
create table tblLeaf8
(
  LeafId UNIQUEIDENTIFIER NOT NULL,
  Lane CHAR(4) NOT NULL,
  ValidFrom DATETIME NOT NULL,
  ValidTill DATETIME NOT NULL,
  Amount MONEY NOT NULL,
  PRIMARY KEY ( Lane, ValidTill, LeafId ),
  CHECK ( Lane = 'CNSE' )
)


и вот такую структуру view:
create view vwLevel1_1 as
  select * from tblLeaf1 union all select * from tblLeaf2

create view vwLevel1_2 as
  select * from tblLeaf3 union all select * from tblLeaf4

create view vwLevel1_3 as
  select * from tblLeaf5 union all select * from tblLeaf6

create view vwLevel1_4 as
  select * from tblLeaf7 union all select * from tblLeaf8

create view vwLevel2_1 as
  select * from vwLevel1_1 union all select * from vwLevel1_2

create view vwLevel2_2 as
  select * from vwLevel1_3 union all select * from vwLevel1_4

create view vwLevelTop as
  select * from vwLevel2_1 union all select * from vwLevel2_2


Такая вставка работает
insert into vwLevel1_1 
(
  LeafId
 ,Lane 
 ,ValidFrom 
 ,ValidTill 
 ,Amount 
)
select newid(), 'uscn', '20130801', '20130831', 123.0

А такие нет
insert into vwLevel2_1 
(
  LeafId
 ,Lane 
 ,ValidFrom 
 ,ValidTill 
 ,Amount 
)
select newid(), 'uscn', '20130801', '20130831', 123.0

insert into vwLevelTop 
(
  LeafId
 ,Lane 
 ,ValidFrom 
 ,ValidTill 
 ,Amount 
)
select newid(), 'uscn', '20130801', '20130831', 123.0


Дело в том, что в живой бд вставка реализована в очень нетривиальной хранимой процедуре. В частности, вставка идет одним запросом с самыми разными значениями поля, по которому будет partitioning. Хотелось бы избежать переписывания ХП и ограничить переделки заменой имени таблицы, в которой сейчас живут все данные, на название view.

Что можно с этим сделать?
16 авг 13, 17:38    [14720046]     Ответить | Цитировать Сообщить модератору
 Re: Ещё вопрос про вставку в partitioned view  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А вы хотите сказать что 256 они случайно ограничили?

SergASh
Очевидный выход - сделать view более высокого уровня
"Лишь бы впендёрить" - не очевидный выход.

Придётся пересмотреть "ваш" случай, может всё-таки не делать много таблиц.

Тем более что в новых версиях ограничения на 1000 для 2005 и сколько-то там для 2008R2.
Так что ограничения всегда будут.
Смотрите что бы выбор таблицы куда вставить не перешло все мысленные границы допустимости.
16 авг 13, 18:04    [14720223]     Ответить | Цитировать Сообщить модератору
 Re: Ещё вопрос про вставку в partitioned view  [new]
SergASh
Member

Откуда:
Сообщений: 167
SergASh
Очевидный выход - сделать view более высокого уровня
"Лишь бы впендёрить" - не очевидный выход.

Это не "лишь бы впендёрить". Приемлемая производительность запроса, ради которого весь огород городится, достигается когда исходная таблица из нескольких десятков миллионов записей секционируется на подтаблицы размером порядка ста тысяч записей. 256 подтаблиц мало учитывая неравномерность распределения данных по полю секционирования.

Вопрос был о том, как вставить во view второго уровня. Я был бы очень признателен, если бы вы посоветовали что-то конструктивное.
16 авг 13, 18:39    [14720309]     Ответить | Цитировать Сообщить модератору
 Re: Ещё вопрос про вставку в partitioned view  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
SergASh
Приемлемая производительность запроса, ради которого весь огород городится, достигается когда исходная таблица из нескольких десятков миллионов записей секционируется на подтаблицы размером порядка ста тысяч записей. 256 подтаблиц мало учитывая неравномерность распределения данных по полю секционирования.


Несколько 10ков миллионов записей - это маленькая таблица. И дело не в неравномерности распределения данных. Вы куда-то не туда гребёте.
16 авг 13, 18:43    [14720319]     Ответить | Цитировать Сообщить модератору
 Re: Ещё вопрос про вставку в partitioned view  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SergASh
256 подтаблиц мало учитывая неравномерность распределения данных по полю секционирования.
У вас в чём проблема?
Статистика (которая в 100 строк) не даёт нужные планы?
Может всё-таки запрос допилить хинтами?
16 авг 13, 18:59    [14720374]     Ответить | Цитировать Сообщить модератору
 Re: Ещё вопрос про вставку в partitioned view  [new]
SergASh
Member

Откуда:
Сообщений: 167
pkarklin
Несколько 10ков миллионов записей - это маленькая таблица. И дело не в неравномерности распределения данных. Вы куда-то не туда гребёте.

Да я уже и сам вижу, что надо искать другое решение. Слишком много сложностей с partitioned view.
16 авг 13, 22:16    [14720876]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить