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

Откуда: Krasnodar->Moscow->Spb->Berlin->Boston
Сообщений: 40
Уважаемые форумчане

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

P.S. Таблицы весьма большие (более 1 млрд строк)

Спасибо
31 янв 14, 16:39    [15501548]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
Dmitri4
Member

Откуда: Москва
Сообщений: 123
rantu,

Причины отказа от кластерного индекса:

1. Люди просто не понимают, что без него таблица находится в неупорядоченном состоянии и искать по ней намного дольше (см. исключение в пункте 2)
2. Если все возможные запросы будут идти к некластеризованным индексам, которые всегда будут содержать в себе всю необходимую информацию (включаемые столбцы) и обращаться к данным самой базы не будет смысла. Тем не менее я всё равно не представляю почему бы его не создать, чтобы упорядочить записи, ведь больше места таблица всё равно занимать от этого не будет, в отличие от некластерного индекса.
3. Возможно создатели не умеют работать и боятся фрагментации кластерного индекса, которая ни в коем случае не устраняется путём DROP/CREATE. Если происходит устранение фрагментации кластерного индекса через DROP/CREATE, то происходит обновление всех некластерных, что могло испугать разработчиков при количестве некластерных индексов более 1.
4. Возможно все запросы возвращают большое количество строк таблицы (лень расписывать этот вариант, но он то же абсурден, так как искать по куче намного сложнее чем по упорядоченному значению).
5. Может они боялись того, что кластерный индекс "дублируется" во всех некластерных?

А теперь действительные причины отказа от кластерного индекса:

1. Если столбцы индекса подвергаются частым изменениям.
2. Не используем кластерным индексом составные ключи
3. Если значения не уникальны. Создать такой индекс можно, но тогда сервер невидимо добавит идентификатор каждому повторяющемуся значению.

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

Сейчас не вспомню точной причины, но Фёдор Самородов (преподаватель центра "Специалист"), утверждал, что кластерный индекс только помогает при секционировании таблиц.

P.S. Возможно я что-то упустил и буду рад услышать это.
31 янв 14, 18:15    [15502366]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
SERG1257
Member

Откуда:
Сообщений: 2835
Ваши действия
1 Обращайтесь к разработчикам с тем же самым вопросом.
Получите либо внятный ответ либо невнятное мычание
2 Во втором случаете поднимаете тестовую среду (надеюсь она у вас есть) перестраивайте там индексы и смотрите как приложение отреагировало на это.
3 Если результат устраивает опять обращаетесь к разработчикам.
Ожидаемый ответ либо - спасибо за работу ваш скрипт будет учтен в новой версии, либо нашему приложению пофиг на ваши манипуляции, либо "внесение подобных изменений приведет к отказу от поддержки".
4 В последнем случаете вздыхаете и материте разработчиков за кружкой пива.
31 янв 14, 18:35    [15502469]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
rantu
Member

Откуда: Krasnodar->Moscow->Spb->Berlin->Boston
Сообщений: 40
Спасибо всем за ответы. Я попробую вариант с тестовой средой, чтобы проверить влияние на производительность запросов.
Я вспомнил один глюк SQL Server при switch partition. Когда переключил содержимое партиции в другую таблицу, потом сделал truncate этой архивной таблицы, сделал merge границы в функции партиционирования, то теперь пустой файл и файлгруппу этой партиции можно удалить (допустим, что в базе всего одна таблица партиционирована). И иногда, например, при ALTER DATABASE [Test] REMOVE FILE [fl_Test_2011_05], возникает ошибка:
"Msg 5042, Level 16, State 1, Line 1
The file 'fl_Test_2011_05' cannot be removed because it is not empty."

И такое лечится только rebuild-ом кластерного индекса у партиционированной таблицы. Вот может быть при его отсутствии такой ошибки не возникает, и файл удаляется без проблем.
Такая ошибка у меня возникала пару раз всего.
1 фев 14, 11:28    [15504065]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
rantu,

Зачем вообще удалять ФГ?
1 фев 14, 16:25    [15504608]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
rantu
Member

Откуда: Krasnodar->Moscow->Spb->Berlin->Boston
Сообщений: 40
NickAlex66,

ну если файлгруппа называется fg_2011_05, то переиспользовать ее и хранить там данные за другие месяца не хочется. Для новых месяцев и новых партиций создаются новые файлгруппы с говорящими названиями. А менять всю схему именования на безымянные FG1, FG2, FG3 в уже созданной базе данных, где два года именовались по одному принципу, не очень хочется.
1 фев 14, 19:46    [15504934]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31822
rantu
Я вспомнил один глюк SQL Server при switch partition
А глюк этот известный? Может, какие то фиксы есть, или вы не так что то делаете?

Просто если бы такой глюк был, партицирование вообще бы было нереально использовать, слишком большая бага...
1 фев 14, 21:04    [15505089]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
rantu,

Если будете строить кластерный индекс по дате создания записи, то табличка слегка выростет. Но это не должно вас останавливать от создания этого индекса.
Раньше, во времена sql2000, можно было получить некоторый выигрышь.
2 фев 14, 01:34    [15505730]     Ответить | Цитировать Сообщить модератору
 Re: Партиционированная таблица без кластерного индекса  [new]
rantu
Member

Откуда: Krasnodar->Moscow->Spb->Berlin->Boston
Сообщений: 40
alexeyvg
rantu
Я вспомнил один глюк SQL Server при switch partition
А глюк этот известный? Может, какие то фиксы есть, или вы не так что то делаете?

Просто если бы такой глюк был, партицирование вообще бы было нереально использовать, слишком большая бага...


Этот глюк случился в тестовой среде в инстансе MSSQL2012 SP1 CU4. Все что нашел в интернете по этой ошибке: сделайте DBCC SHRINKFILE EMPTYFILE (но это один файл в файлгруппе, поэтому такая команда завершается ошибкой), ALTER PARTITION SCHEME NEXT USED (типа, вдруг эта файлгруппа отмечена как next used и надо снять с нее эту метку отметив какую то другую), ну и совет насчет index rebuild, который и помог. И в данный момент одна база в продакшене тоже у меня дала удалить все старые файлы и файлгруппы, кроме одной с такой же ошибкой, но cluster index rebuild не хочу делать, потому что база нагруженная сильно.

Может и есть какой то фикс в других CU для 2012 версии, но пока не ставил. Ошибка редкая и плавающая наверное, в интернете мало про нее написано.
2 фев 14, 22:48    [15507652]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить