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

Откуда:
Сообщений: 381
хочу разбить таблицы на партишны по полу Дата. таблицы состоят из парент и несколько чилдрен. чилдрен имеют парент ИД и не имеют Дата. обычная 3я НФ

я не могу понять как сделать партишн и при этом не добавлять поле Дата в чилдрен. таблицы большие и нагрузка увеличится еще в 10р через пару месяцев. делать денормализацию мне меньше всего хочется.
22 май 11, 14:38    [10690483]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Для того чтобы решить как секционировать необходимо указать несколько факторов.
Один из них - возникшие проблемы.
Сколько сейчас данных ложатся? (миллиардов строк в день)
Как данные отбираются (принципы селектов)? По каким колонкам? Сейчас у вас активное ID по дочерним таблам, а к главной Дата в основном или может также по ключу обращаются?

Не надо ради идеализма выворачивать схему данных, может быть удастся подобрать добротный "костыль", который может оказаться лучше по всем параметрам. :)
22 май 11, 22:17    [10691262]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
90% всех селектов выбирают данные по Дате и только один день. поэтому хочу разсекционировать по дню. что бы не тратиться на индексы. хочу что бы чилдрены были выравнены с парентом.

похоже что без денормализации не обойтись.

добавляется 3млн в день. будет 30млн. прежде чем давать совет прошу заметить что у меня нет админ доступа и многие вещи мне недоступны (есть дбо на базу и все). ДБА же у нас чешутся только когда все падает.

выборки типа

select date, parent.*, child1.* from parent p join child1 c on p.id = c.parentId where date = '<today>'

или что бы быть более точным выборки из вью которые все джойн с парентом по кластерному ИД

select * from vwChild1 where date = '<today>'
23 май 11, 12:02    [10693265]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Полуэкт
похоже что без денормализации не обойтись.
А вы на этом не потеряете больше?

Если у вас строгий ID по отношению к дате, то можно секционировать по нему.
И дописать в запросе: AND ID > {CurrentMinID}
И можно добавить контрольный в голову CHECK (Date < 'Const' OR ID > {Const}) + можно партицию указать.

Ну а потом откусывать периодически (тут целая цепочка, чтоб ресканов небыло).
"Неприятность" - менять вьюшку надо с подстановкой этого MinID.
Осталось планы проверить.
23 май 11, 12:36    [10693584]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
вполне возможно что потеряю. даже наверняка потеряю.

однако вопрос не в том как сделать лучше всего а как сделать быстрее из возможных вариантов.

возможные варианты

- оставить как есть
- разбить на дневные партишн и не использовать никаких индексов кроме кластерных
- морочиться с ежедневными переделываниями процедур или фильтрованными индексами (то что ты предлагаешь с вью сделать я думаю можно сделать с фильтрованным индексом)

так если скажем запрос будет выполняться 4мин для варианта 1, 1мин для варианта 2 и 15 сек для 3 то я выберу все равно 2 тк в нашей среде полагаться на ежедневные процедуры нельзя тк люди которые следят за этими процедурами идиоты и оно будет либо падать либо забываться выполниться либо еще что либо и я по полдня буду сидеть и разбираться.
23 май 11, 14:55    [10694693]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а я бы дату "пробросил" в деток. куча вопросов автоматом полечится.
23 май 11, 16:00    [10695232]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Полуэкт
(то что ты предлагаешь с вью сделать я думаю можно сделать с фильтрованным индексом)
Это само собой, но только чтоб эти индексы поднялись нужно чтоб запросы имели соответствующее условие.
Т.е. фильтрованные индексы всегда имеют отражение в коде.

Да, тогда вы можете вообще забить на секционирование. Если цель сэкономить на размере.

А вот для бэкапа незнаю.
ReadOnly (по старым секциям) даст пересоздавать индекс на табле? А если дописать условие по партиции?

Полуэкт
тк в нашей среде полагаться на автоматически изменяемые view нельзя тк люди которые следят за этими - идиоты
Да, согласен.
Думал что вы будете этим заниматься.
23 май 11, 16:14    [10695355]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
цель не съэкономить на размере а сделать так что бы запросы выполнялись с "приемлемой" скоростью и не создавать 50Гб индексов для каждого нового запроса. поэтому мой план - разбить на секции и перевалить заботу на админов и не делать индексы тк запросы по одному дню работают достаточно быстро. поэтому я надеюсь если данные будут лежать по одному дню то и запросы будут сравнительно быстрые.
23 май 11, 16:54    [10695740]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Хреново делать работу за других.
+
Вы можете сделать не одну таблу, а скажем две. Ежедневные запросы делаете по одной, а остальные по тупой VIEW с UNION ALL. Ну и тупо переключать секции из одной в другую.
Но для FK нужно будет кусок статичного текста добавить.
1. DROP FKs
2. SWITCH секции
3. CREATE FKs (NOCHECK для складских таблиц)

Да нет способов куча, всё зависит от задачи и условий. Например:
Данные в таблицах первичны. Обращаться к ним напрямую глупо. Для наших запросов рисуем одну или набор нужных представлений.
Вешаем на них нужные вам индексы с условием по дате (или прямо во вью прописываем дату). Меленькие индексы и притом какие хотите и только на вьюшках, и к самим таблицам никаких обращений при запросах - рай. Индексы пересоздаются быстро - т.к. данных то ещё нет/мало.

А секционирование поставьте тупо по ID для упрощения бэкапирования (ReadOnly файловые группы).

PS: Если чесно не вижу проблем с генерацией скриптовых объектов. Админов тут и не надо, вешаете триггер на "открытие дня" и делов-то.
23 май 11, 22:38    [10697160]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
трудно объяснить нормальному человеку :) у нас все с ног на голову. если делать сложное решение с созданием скриптов переиндексированием и тд то мне нужно это тестировать сопровождать и поддерживать. те если что то не сработало пинать будут меня.

если я сделаю партишн если что то не будет работать то пинать будут админов :)

но кроме здорового эгоизма у меня есть еще аргументы. например партишн делают один раз и забываются. те объект которой может подвести один и находится в руках умных и могучих админов.

для всех этих мельтешений с фильтрованием индексов и вью объектов будет 100. и любой из них может навернутся.

риск просто несравнительный.

моя система больше чем полчаса простаивать не может. а любая проблема с данными где в таблице 100Гб занимает часы...

поэтому еще одно условие про которое я не упоминал - максимальная надежность при минимальном тестировании....

короче я думаю партишн решает все мои проблемы без отрицательных сторон (для меня).
24 май 11, 17:38    [10701820]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ссори, тяжело переключится.

Просто у вас свои тараканы в голове у меня свои.
Вы оцениваете, что А сложнее/надёжнее Б, у меня может быть наоборот и мы оба может и правы. Просто мы по разному это готовим.

1. Вот вы оцениваете, что огромный объём сильно влияет на скорость запросов, но это не совсем так (или совсем не так). Дополнительная страница дерева - делов-то.
2. Вы можете никогда не менять вью вообще (никакой динамики), и для нового индекса проставляете "его дату". Это я предложил если кто-то из сюда заглядывающих захочет экономить.
3. В вашем случае, разницы между добавлением поля в таблицу или созданием view с одной дополнительной колонкой совершенно никакой. Просто во вью можно добавить не её одну, а сколько вам угодно для дальнейшего удобства (да при создании тех же индексов).
24 май 11, 18:34    [10702228]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
Полуэкт
- разбить на дневные партишн и не использовать никаких индексов кроме кластерных

Как доп. информация:

Если у вас запросы будут такого вида:

SELECT * FROM dbo.DataTable WHERE dateColumn = '20110524'

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

Насколько это эффективно для нетривиальных запросов, с множеством джоинов и т.п. я информации не имею... Может кто-то пробовал, поделится...
25 май 11, 00:28    [10703370]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
Александр Волок (def1983)
Если у вас запросы будут такого вида:

SELECT * FROM dbo.DataTable WHERE dateColumn = '20110524'

и у вас будет секционирование по дням, то индексы можно вообще не создавать...
this is my plan exactly! :)
25 май 11, 16:21    [10707914]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Александр Волок (def1983),
Т.е. на вопрос TS:
Полуэкт
Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?
Будет ответ:
Полуэкт
Не делать!
(на чайлд)

Т.е. off-top

+ Полуэкт
Это ни в ком случае не наезд, у вас есть решение у вашей проблемы. В топике есть решения на проблему в ней описанную.
Всё замечательно.
25 май 11, 18:48    [10709041]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Александр Волок (def1983)
Member

Откуда: Rotterdam
Сообщений: 4959
Полуэкт
Александр Волок (def1983)
Если у вас запросы будут такого вида:

SELECT * FROM dbo.DataTable WHERE dateColumn = '20110524'

и у вас будет секционирование по дням, то индексы можно вообще не создавать...
this is my plan exactly! :)


Даже кластерные... т.е. в итоге будет секционированная, без единого индекса куча... благо в 2

2Mnior,

Да я ведь ответил не на основной вопрос...
26 май 11, 14:48    [10713387]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать партишн на парент и чайлд таблицы если чайлд не имеет поля для партишн?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Погорячился я тут.
Вообще-то уход от проблемы это тоже ответ на вопрос, по большому счёту.
А то привыкли отвечать только в узких рамках, что неверно в корне.
26 май 11, 19:21    [10715785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить