Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
kimi
Member

Откуда:
Сообщений: 17
Господа,
такая ситуация -таблица(куча) занимает ~125GB .свободного места в базе ~55GB.
задача создать кластерный индекс по полю varchar(30)

вопрос -есть ли метод.формула подсчитать необходимый free space для создания етого индекса?
16 июл 12, 13:46    [12872381]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
http://msdn.microsoft.com/en-us/library/ms191163(v=SQL.105).aspx
16 июл 12, 13:48    [12872386]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
egaraev
Member

Откуда:
Сообщений: 63
Зависит от кол-ва строк в таблице, но еше нужно будет место для временного хранения листовых узлов. Я думаю нужно будет порядка 130-140 Гб.
16 июл 12, 14:56    [12872821]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
egaraev
Зависит от кол-ва строк в таблице, но еше нужно будет место для временного хранения листовых узлов. Я думаю нужно будет порядка 130-140 Гб.
Зависит, но не сильно. Скорее всего, 125Gb в куче займут те же 125Gb в кластерном индексе. Да, от записей зависит размер дерева, но он гораздо меньше по сравнению со всей таблицей, чем вам кажется. Специально нашел таблицу такого размера с 20ти байтовым ключом и 2+ млрд записей - index size всего 500 Мб.

А вот от чего зависит сильно - так это от филлфактора. Можно такой выставить, что и полтора терабайта может не хватит.
16 июл 12, 16:15    [12873292]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
kimi
Господа,
такая ситуация -таблица(куча) занимает ~125GB .свободного места в базе ~55GB.
задача создать кластерный индекс по полю varchar(30)

вопрос -есть ли метод.формула подсчитать необходимый free space для создания етого индекса?

55Гб вам явно будет недостаточно.
http://msdn.microsoft.com/en-us/library/aa174535(v=sql.80).aspx
Free Space Requirements

When you specify the SORT_IN_TEMPDB option, you must have sufficient free space available in tempdb to hold the intermediate sort runs, and enough free space in the destination filegroup to hold the new index. The CREATE INDEX statement fails if there is not enough free space and there is some reason the databases cannot autogrow to acquire more space (such as no space on the disk, or autogrow turned off).

If SORT_IN_TEMPDB is not specified, the available free space in the destination filegroup must be roughly the size of the final index. During the first phase, the sort runs are built and require about the same amount of space as the final index. During the second phase, each sort run extent is freed after it has been processed. This means that sort run extents are freed at about the same rate at which extents are acquired to hold the final index pages, so the overall space requirements do not greatly exceed the size of the final index. One side effect of this is that if the amount of free space is very close to the size of the final index, the database engine will tend to reuse the sort run extents very quickly after they are freed. Because the sort run extents are freed in a somewhat random manner, this reduces the continuity of the index extents in this scenario. If SORT_IN_TEMPDB is not specified, the continuity of the index extents is improved if there is enough free space available in the destination filegroup that the index extents can be allocated from a contiguous pool rather than from the freshly deallocated sort run extents.

At the time you execute the CREATE INDEX statement, you must have available as free space:

When you create a nonclustered index:
If SORT_IN_TEMPDB is specified, there must be enough free space in tempdb to store the sort runs, and enough free space in the destination filegroup to store the final index structure. The sort runs contain the leaf rows of the index.

If SORT_IN_TEMPDB is not specified, the free space in the destination filegroup must be large enough to store the final index structure. The continuity of the index extends may be improved if more free space is available.

When you create a clustered index on a table that does not have nonclustered indexes:
If SORT_IN_TEMPDB is specified, there must be enough free space in tempdb to store the sort runs, which include the data rows of the table. There must be enough free space in the destination filegroup to store the final index structure, including the data rows of the table and the index B-tree. A rough estimate is 1.2 times the size of the original table, although you may need to adjust the estimate for factors such as having a large key size or a fillfactor with a low value.

If SORT_IN_TEMPDB is not specified, the free space in the destination filegroup must be large enough to store the final table, including the index structure. The continuity of the table and index extents may be improved if more free space is available.

When you create a clustered index on a table that has nonclustered indexes:
If SORT_IN_TEMPDB is specified, there must be enough free space in tempdb to store the collection of sort runs for the largest index (typically the clustered index), and enough free space in the destination filegroup to store the final structures of all the indexes, including the clustered index that contains the data rows of the table.

If SORT_IN_TEMPDB is not specified, the free space in the destination filegroup must be large enough to store the final table, including the structures of all the indexes. The continuity of the table and index extents may be improved if more free space is available.
16 июл 12, 22:43    [12874945]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
kimi
Member

Откуда:
Сообщений: 17
всем спасибо за помощь,прочтя http://msdn.microsoft.com/en-us/library/ms191163(v=SQL.105).aspx и основываясь на below info
очевидный вывод 55Гб мало поэтому вчера стартанул заливку данных кусками(batch вставлю в финальну таблицу-batch удалю из кучи) из этой кучи в финальные таблицы без кластера,половину залью попытаюсь создaть кластер.
Rows=453669687 MinimumRecordSize=9 MaximumRecordSize=750 AverageRecordSize= 270
LogicalFragmentation =99.999992370605469 ExtentFragmentation= 1.9704520702362061


автор
125Gb в куче займут те же 125Gb в кластерном индексе

всетаки меньше будет,на пару десятков Gb так.

автор
А вот от чего зависит сильно - так это от филлфактора. Можно такой выставить, что и полтора терабайта может не хватит

эксперементировать с филлфактор даже мысли не было
17 июл 12, 12:47    [12877241]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
kimi
очевидный вывод 55Гб мало поэтому вчера стартанул заливку данных кусками(batch вставлю в финальну таблицу-batch удалю из кучи) из этой кучи в финальные таблицы без кластера,половину залью попытаюсь создaть кластер.
Как то странно. Заливка данных в кучу, а потом построение кластера всяко будет медленнее. Сначала создайте таблицу с кластером, а потом вставляйте в неё данные.
17 июл 12, 20:51    [12880395]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Mind
kimi
очевидный вывод 55Гб мало поэтому вчера стартанул заливку данных кусками(batch вставлю в финальну таблицу-batch удалю из кучи) из этой кучи в финальные таблицы без кластера,половину залью попытаюсь создaть кластер.
Как то странно. Заливка данных в кучу, а потом построение кластера всяко будет медленнее. Сначала создайте таблицу с кластером, а потом вставляйте в неё данные.
Это смотря какой ключ у кластерного индекса будет.
18 июл 12, 12:26    [12882736]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Гавриленко Сергей Алексеевич
Mind
пропущено...
Как то странно. Заливка данных в кучу, а потом построение кластера всяко будет медленнее. Сначала создайте таблицу с кластером, а потом вставляйте в неё данные.
Это смотря какой ключ у кластерного индекса будет.
А поподробнее? В каких случаях вставка в кучу а потом построение кластера может оказатся быстрее чем наоборот?
19 июл 12, 01:01    [12886126]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Mind
Гавриленко Сергей Алексеевич
пропущено...
Это смотря какой ключ у кластерного индекса будет.
А поподробнее? В каких случаях вставка в кучу а потом построение кластера может оказатся быстрее чем наоборот?
Не возрастающий. В самом худшем случае - случайный. Например guid или хеш какой.
19 июл 12, 02:09    [12886229]     Ответить | Цитировать Сообщить модератору
 Re: Подсчитать необходимый free space для создания clustered index на куче of 125GB  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Гавриленко Сергей Алексеевич
Mind
пропущено...
А поподробнее? В каких случаях вставка в кучу а потом построение кластера может оказатся быстрее чем наоборот?
Не возрастающий. В самом худшем случае - случайный. Например guid или хеш какой.
Учитывая что в данном конкретном случае данные переливаются из другой таблицы, а не генерятся на лету, то сервер сам их отсортирует перед вставкой в кластер. Учитывая конечно, что места на диске не достаточно и лить нужно порциями, то все что нужно сделать ТС это брать данные блоками отсортированными по полю включенному в кластерный индекс.
А если вставлять записи в таблицу по одной, тогда конечно guid это будет зло.
19 июл 12, 20:02    [12890311]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить