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

Откуда: Київ
Сообщений: 10428
есть таблица

create table t
(
id int not null primary key,
name nvarchar(1024),
property nvarchar(1024),
flag int not null default(0)
)


в ней 10 млн записей

Хочу разделить на две

create table t1
(
id int not null primary key,
name nvarchar(1024),
property nvarchar(1024)
)
create table t2
(
id int not null primary key,
flag int not null default(0)
)


Вопрос: что лучше - в таблице t2 всегда держать 1:1 записей с t1 и не удалять
или только записи со значением флага не 0

В t2 всегда количество записей < чем в основной t1 по определению, т.е. часть записей не может иметь flag не 0
18 окт 12, 16:42    [13341855]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Зачем вы все это хотите делать?
18 окт 12, 16:47    [13341913]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Добрый Э - Эх
Guest
Winnipuh,

может подумать в сторону секционирования (partition table)?
18 окт 12, 17:01    [13342077]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
из чего следует это
Winnipuh
В t2 всегда количество записей < чем в основной t1 по определению
и это
Winnipuh
часть записей не может иметь flag не 0
?
18 окт 12, 17:10    [13342164]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гавриленко Сергей Алексеевич
Зачем вы все это хотите делать?


часто возникают блокировки на апдейте поля флаг, поскольку t мастер таблица для 20 подчиненных.
Там структура посложнее, в этом примере - одно поле флаг, там еще есть другие поля, которые тоже апдейтятся.
Например, в подчиненных таблицах есть триггеры, которые при изменении их данных апдейтят поле flag (там таких полей несколько)
Вот и получается змея, кусающая себя за хвост.
18 окт 12, 17:13    [13342199]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Winnipuh,
имхо,
изменения от подчинённых на мастер таблице нужны онлайн или можно асинхронн?
может не апдейтить, а писать для объекта из мастер таб. новое актуальное состояние?
18 окт 12, 17:32    [13342373]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Дедушка
Winnipuh,
имхо,
изменения от подчинённых на мастер таблице нужны онлайн или можно асинхронн?
может не апдейтить, а писать для объекта из мастер таб. новое актуальное состояние?


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

select *, flag from t

теперь это отдельный запрос

select *, flag from v2

где v2 - это вью
или если был запрос только для поля флаг, то теперь это будет

select flag from е2

А при создании записи я делаю вместо одного инсерта два:

insert into t1()
insert into t2()

Так вот в этом и вопрос - надо ли поддерживать 1:1 записи, или добавлять в t2 по мере необходимости, а во вью сделать
outer join чтобы смоделировать исходную t
18 окт 12, 17:39    [13342413]     Ответить | Цитировать Сообщить модератору
 Re: Разделить таблицу на две  [new]
parteigenosse
Member

Откуда: Киев
Сообщений: 281
а если глянуть с меркантильной стороны?
каковы размеры таблиц? насколько критично занимаемое место? второй вариант, когда держать только те, у кого есть флаги, будет экономнее по месту.
но возникают нюансы в части выборок. чтобы полностью сэмулировать исходную таблицу нужно будет писать left join и isnull(t2.flag,0), а это получится приличный удар по производительности по сравнению с 1:1, и заметно будет опять же, на больших объемах. с другой стороны запросы типа where flag = 1 будут отлично отрабатывать c t1 inner join t2.
кстати, какова селективность по этому флагу? может там отбросится всего пара процентов записей и не стоит и думать об этом?
19 окт 12, 09:54    [13344587]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить