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

Откуда: Минск
Сообщений: 1838
Добрый день.
С помощью мастера сгенерировал скрипт
BEGIN TRANSACTION
CREATE PARTITION FUNCTION [fnILE](datetime) AS RANGE RIGHT FOR VALUES (N'2014-01-01T00:00:00')

CREATE PARTITION SCHEME [schILE] AS PARTITION [fnILE] TO ([Data Filegroup 1], [Data Filegroup 1])

ALTER TABLE [dbo].[BLABLA] DROP CONSTRAINT [PK_BLABLA]

ALTER TABLE [dbo].[BLABLA] ADD  CONSTRAINT [PK_BLABLA] PRIMARY KEY NONCLUSTERED 
(
	[Entry No] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]

CREATE CLUSTERED INDEX [ClusteredIndex_on_schILE_635508882709628477] ON [dbo].[BLABLA]
(
	[Posting Date]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [schILE]([Posting Date])

DROP INDEX [ClusteredIndex_on_schILE_635508882709628477] ON [dbo].[BLABLA]

COMMIT TRANSACTION

Меня интересуют строки CREATE CLUSTERED INDEX [ClusteredIndex_on_schILE_635508882709628477] и DROP INDEX [ClusteredIndex_on_schILE_635508882709628477].
т.е. он сначала создает кластерный индекс, я так понимаю чтобы применить секционирование к таблице, а затем удаляет, т.к. по этому полю не было индекса.
Как я понимаю если таблица секционирована, то при отсутствии видимого в SSMS кластерного индекса она не размещена в куче или как?
Здесь Преобразование несекционированной таблицы в секционированную сказано что одним из вариантов является создание секционированного кластерного индекса, что скрипт и делает. Но там не сказано про то, что если удалить этот индекс, что произойдет с таблицей?
В свойствах таблицы я вижу что она секционирована на 2 части.
Однако автогенерация скрипта создания таблицы генерирует скрипт без секционирования.
Вопрос после этого удаления кластерного секционированного индекса, что произойдет с таблицей? Она будет работать как и раньше + еще и будет секционирована по выбранной схеме или все таки необходимо оставить этот индекс?
6 ноя 14, 17:43    [16807736]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Над кучей нельзя проводить никаких операций по перемещею данных между файловыми группами. Есть два способа это сделать - через создание новой таблицы и переливки данных туда, или через создание и удаление кластерного индекса.
6 ноя 14, 17:50    [16807770]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1838
Гавриленко Сергей Алексеевич,

ALTER TABLE [dbo].[BLABLA] DROP CONSTRAINT [PK_BLABLA]


Этот PK-индекс был кластеризованный. Скрипт его удалил и пересоздал как некластеризованный.

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

А затем он удалил этот индекс.

Таблица остается без кластеризованного индекса.
Судя по значениям в свойствах таблица она остается секционирована. Как теперь располагаются секции в своих файловых группах, как кучи или как B-деревья?
Остается ли таблица полноценно секционированной?
Есть ли разница в хранении данных на уровне сервера если таблица секционирована, но кластеризованный индекс удален?
6 ноя 14, 18:01    [16807828]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
X-Cite
Таблица остается без кластеризованного индекса.
Значит вы что-то не то натыкали в мастере.
X-Cite
Как теперь располагаются секции в своих файловых группах, как кучи или как B-деревья?
Как кучи для таблиц-куч, и как B-деревья для таблиц с кластерным индексом.
X-Cite
Остается ли таблица полноценно секционированной?
А что такое "неполноценно секционирована"? Это примерно так же, как и "немножко беременна"?
6 ноя 14, 18:06    [16807853]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
X-Cite
Однако автогенерация скрипта создания таблицы генерирует скрипт без секционирования.


Это зависит от настройки скриптогенератора.
6 ноя 14, 18:06    [16807854]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1838
Гавриленко Сергей Алексеевич
X-Cite
Таблица остается без кластеризованного индекса.
Значит вы что-то не то натыкали в мастере.

Там в принципе нечего было тыкать.
Раньше на таблице кластерный индекс был по полю А1. А таблицу секционировали по полю B1.
Скрипт превратил кластерный индекс по полю А1 в некластерный. А по полю B1 создал кластерный секционированный индекс. Но затем видимо посмотрел что обычного индекса по нему не было, и он его удалил.
У меня вопрос, этот индекс как я понимаю надо оставить?
Ведь нельзя же в каждой секции создать свой кластеризованный индекс по полю А1?
т.е. чтобы таблица была секционирована по полю B1 но с кластерным индексом по полю А1 как и раньше....
6 ноя 14, 18:13    [16807882]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Как вы представляете ситуацию, при которой данные разных секций находятся в одной странице?
7 ноя 14, 12:17    [16811021]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
X-Cite
У меня вопрос, этот индекс как я понимаю надо оставить?
Ведь нельзя же в каждой секции создать свой кластеризованный индекс по полю А1?
т.е. чтобы таблица была секционирована по полю B1 но с кластерным индексом по полю А1 как и раньше....

1. можно и удалить
2. зачем создавать свой индекс в каждой секции?. Индекс создается для все таблицы разом. Создавайте свой кластерный индекс по полю А ТОЛЬКО не забудьте указать в его свойствах схему секционирования по полю Б, иначе таблица опять станет несекционированной


только вот у Вас поле А - примари кей, тут такое может и не прокатить
7 ноя 14, 13:18    [16811633]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1838
Проблема в том, что все индекса создаются сторонней программой. В данном случае Microsoft Dynamics Navision. И она хранит в своих служебных таблицах информацию обо всем что создает... просто взять и вмешаться напрямую в БД не вариант.. И соответственно PK тоже был создан через нее. Мы конечно можем создавать индекса в обход ее, но программа о них ничего не знает. Поэтому меня интересовал вопрос, чтобы вернуть PK как и было, чтобы программа ничего не заметила. т.е. чтобы таблица была секционирована по дате, а данные в каждой секции были бы расположены по полю Identity как и было до секционирования.
7 ноя 14, 14:20    [16812112]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
X-Cite, в данном конкретном случае никак. Если только в "сторонней программе" не поправить инфу о первичном ключе, в который добавить поле секционирования.
7 ноя 14, 14:47    [16812263]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL 2012 Секционирование таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Я недавно делал партиционирование на крупной таблицы и все скрипты я сам писал руками и делал переливку из старой таблицы в новую, чтобы всё сразу легло по партициям. Делать перегон данных меж партициями гиблое занятие на больших данных.
7 ноя 14, 15:07    [16812431]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить