powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно создать секционированное представление?
17 сообщений из 17, страница 1 из 1
Как правильно создать секционированное представление?
    #39765730
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, приветствую!

Есть несколько [десятков] региональных баз. Структура таблиц - аналогичная.
Хочется "виртуально" склеить их в одну БД, собрав в данные как секционированное представление, добавив колонку с кодом региона, типа:
Код: sql
1.
2.
3.
4.
5.
Select *, 1 as region from db1.table1 
Union all
Select *, 2 as region from db2.table1 
Union all
...


Проблема в том, что в таблицах БД никакого кода региона нету. И, соответственно, констрейнт region between 1 and 1 в таблицу не вставишь. И условие Where region = 1 во вью тоже не поместишь.

И в результате этого запросы вида:
Код: sql
1.
2.
Select * from all_db.table1 a inner join all_db.table2 b on a.region=b.region and a.id=b.parent_id
Where a.region = 1


Генерируют планы с обращением во все таблицы.
Спасает, если добавить Where a.region = 1 and b.region = 1 Option (recompile), но в случае уже трех таблиц, например - это почему то не работает. Да и не всегда вариант.

Как быть то?
view нужны только на чтение.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765756
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterКак быть то?region должна быть колонкой во всех таблицах, входить в ПК, и на неё в каждой таблице должен быть наложен соотв чек-констрейн (то есть в db1 - "region=1" и т.д.)
BOL2.Partitioning column
•The partitioning column is a part of the PRIMARY KEY of the table.
•It cannot be a computed, identity, default, or timestamp column.
•If there is more than one constraint on the same column in a member table, the Database Engine ignores all the constraints and does not consider them when determining whether the view is a partitioned view. To meet the conditions of the partitioned view, there should be only one partitioning constraint on the partitioning column.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765764
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterКак быть то?Напишите инлайновую функцию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create function dbo.fnRegionalData
(
 @region int
)
returns table
as
return (
 Select *, @region as region from db1.table1 where @region = 1
 Union all
 Select *, @region from db2.table1 where @region = 2 
 Union all
...
);
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765794
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, странно видеть имя типа db1.table1. Где имя схемы, спрашивается?
Во-вторых, если написать инлайн-функцию, то можно будет в неё просто вставлять запись
и быть уверенным, что она автоматически вставится в нужную таблицу подобно секционированному view?
Очевидно, это невозможно. Плюс к этому и синтаксис обращения к функции будет отличаться от синтаксиса
обращения к таблице. Наверно, это никого не обрадует.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765801
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapВо-вторых, если написать инлайн-функцию, то можно будет в неё просто вставлять запись
и быть уверенным, что она автоматически вставится в нужную таблицу подобно секционированному view?uaggsterview нужны только на чтение.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765806
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapВо-первых, странно видеть имя типа db1.table1. Где имя схемы, спрашивается?
вторую точку пропустил, прошу прощения.
Читать как: "db1..table1"
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765810
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvguaggsterКак быть то?region должна быть колонкой во всех таблицах, входить в ПК, и на неё в каждой таблице должен быть наложен соотв чек-констрейн (то есть в db1 - "region=1" и т.д.)
BOL2.Partitioning column
•The partitioning column is a part of the PRIMARY KEY of the table.
•It cannot be a computed, identity, default, or timestamp column.
•If there is more than one constraint on the same column in a member table, the Database Engine ignores all the constraints and does not consider them when determining whether the view is a partitioned view. To meet the conditions of the partitioned view, there should be only one partitioning constraint on the partitioning column.

Да понимаю я это.
Никакого обходного трюка нет?
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765897
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterНикакого обходного трюка нет?Не знаю такого :-(
очень уж это сложно, видимо, разложить данные по таблицам по таким критериям в общем виде.
Конечно, мы видим глазами, как секционируются данные, но серверу понять, что, оказывается, какая то константа "1 as region", в качестве поля, является колонкой секционирования...
Видимо, это нереально сложно.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765918
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterНикакого обходного трюка нет?Вам трюк был показан.
Таблица может быть в плане, но в реальности обращений к ней нет. Именно так работает этот "трюк".
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39765939
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Поставьте Вертику и не изобретайте велосипед
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766061
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmuaggsterНикакого обходного трюка нет?Вам трюк был показан.
Таблица может быть в плане, но в реальности обращений к ней нет. Именно так работает этот "трюк".
Да, я его обдумываю. Отпугивает изменение синтаксиса запросов.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766066
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voroninuaggster,

Поставьте Вертику и не изобретайте велосипед
Да с тем же успехом можно создать отдельную базу с таблицами с кластерным колумнстором, и перегружать данные в нее. Ну или вообще как то перегружать данные в специализированное хранилище.
Это то как раз не проблема (в смысле не проблема понять, что так можно сделать).
Хочется быстро, наивно и прозрачно.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766075
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvguaggsterНикакого обходного трюка нет?Не знаю такого :-(
очень уж это сложно, видимо, разложить данные по таблицам по таким критериям в общем виде.
Конечно, мы видим глазами, как секционируются данные, но серверу понять, что, оказывается, какая то константа "1 as region", в качестве поля, является колонкой секционирования...
Видимо, это нереально сложно.
Т.е., играть только по-честному.
Добавить колонку регион not null в каждую таблицу, добавить ее же в кластерный индекс (в конец индекса, чтобы не сломала запросы в региональных базах), добавить констрейнты в каждую таблицу Constraint c_region check region = 1 with check, и, потом, по-честному, в view писать where region = 1.
... и при этом, возможно, на не-энтерпрайзе должным образом всё равно не заработает (было там какое-то говно по секционированным представлениям, не помню какое).
ЧУдно.
:-(
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766102
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

это действительно наивно, т.к. при выведения одной из баз ил итаблиц из доступности всё приложение перестанет работать.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766142
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggstera_voroninuaggster,

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

Быстро, наивно и прозрачно делается с помощью Вертики или Кликхауса, где все уложено в колумсторы и расшардено по нодам. Из коробки. Вертика до 1Мб бесплатна. Кликхаус бесплатен, но более убог.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766298
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосовuaggster,

это действительно наивно, т.к. при выведения одной из баз ил итаблиц из доступности всё приложение перестанет работать.
Это снепшоты, и вся эта конструкция - используется для эпизодических отчетов. Так что это не очень существенно.
Но да. Это проблема.
...
Рейтинг: 0 / 0
Как правильно создать секционированное представление?
    #39766390
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Достаточно кому-то запросом залочить одну из таблиц в одной из баз. Я бы подумал о сборщике данных, тем более что при добавлении-убавлении новых баз не придется переписывать код.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно создать секционированное представление?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]