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

Откуда: Санкт-Петербург
Сообщений: 348
Добрый день, коллеги.

Озадачился перестроением таблиц, которые сильно часто обновлялись, менялись и т.д. и т.п.
команда REBUID. Хочу уточнить, как мне оценить качество данных в таблице? Т.е. каким образом
увидеть нечто вроде "фрагментации". Скорее всего не правильный термин к этому случаю.
5 фев 14, 13:48    [15522402]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
gR4mm
Member

Откуда: Москва
Сообщений: 1412
sys.dm_db_index_physical_stats
5 фев 14, 13:52    [15522433]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
gR4mm
sys.dm_db_index_physical_stats


Если я не ошибаюсь в этом представлении речь идет о индексах. А что касаемо таблицы?
5 фев 14, 13:54    [15522454]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
gR4mm
Member

Откуда: Москва
Сообщений: 1412
Не только про индексы

автор
For an index, one row is returned for each level of the B-tree in each partition. For a heap, one row is returned for the IN_ROW_DATA allocation unit of each partition.
5 фев 14, 14:04    [15522543]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
gR4mm
Не только про индексы

автор
For an index, one row is returned for each level of the B-tree in each partition. For a heap, one row is returned for the IN_ROW_DATA allocation unit of each partition.


Прошу прощения, т.е. для кучи требуется перестроение таблицы, а для таблицы содержащей кластерный индекс это равноценно rebuild кластерного индекса?
5 фев 14, 14:56    [15522922]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Прошу прощения, т.е. для кучи требуется перестроение таблицы,

Кучу нельзя перестроить
5 фев 14, 19:27    [15524797]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
Glory
MedBrat
Прошу прощения, т.е. для кучи требуется перестроение таблицы,

Кучу нельзя перестроить


ну типа можно же, начиная с 2008-ого.
чтобы откомпрессить (page compression) новые данные, залитые в таблицу, делают
ALTER TABLE  REBUILD  WITH (DATA_COMPRESSION = PAGE)


только при чем тут выделенная в цитату фраза про то, что показывает sys.dm_db_index_physical_stats для куч -- загадка
5 фев 14, 19:42    [15524865]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
ну типа можно же, начиная с 2008-ого.
чтобы откомпрессить (page compression) новые данные, залитые в таблицу, делают
ALTER TABLE  REBUILD  WITH (DATA_COMPRESSION = PAGE)

Разве это равносильно дефрагментации ?
5 фев 14, 20:02    [15524946]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
Glory,
это был ответ математика-педанта на "Кучу нельзя перестроить"
---------------
лучший способ дефрагментировать кучу -- это навесить на нее кластерный индекс
но TC об этом не спрашивал.
вернее, о чем спрашивал TC в 5-ом посте, мне вообще непонятно :)
5 фев 14, 20:10    [15524970]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
это был ответ математика-педанта на "Кучу нельзя перестроить"

т.е. перестроить для вас - это только ALTER REBUILD ? Других вариантов просто не существует ?
5 фев 14, 20:12    [15524976]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
Glory,

для меня отрицанием высказывания с квантором всеобщности является высказывание с квантором существования.
достаточно указать один способ перестроения для опровержения "нельзя перестроить".
следующим вопросом будет, перевожу ли я REBUILD как "перестроение"? :)
5 фев 14, 22:42    [15525475]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
Glory,

для меня отрицанием высказывания с квантором всеобщности является высказывание с квантором существования.
достаточно указать один способ перестроения для опровержения "нельзя перестроить".
следующим вопросом будет, перевожу ли я REBUILD как "перестроение"? :)

т.е. по вашему "нельзя перестроить" эквивалентно "нельзя выполнить ни одну команду, в тексте которой есть ключевое слово rebuild" ?
И следующий раз, если я скажу, например, "нельзя сделать выборку", то вы приведете какой-нибудь пример с ключевым словом select ? Потому что "выборка" == "select", а раз можно написать команду с select, то квантор "нельзя сделать выборку" не всеобщий ?
5 фев 14, 23:49    [15525705]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
Вы утверждаете: Кучу нельзя перестроить.
Paul Randal утверждает: If you think you can use ALTER TABLE … REBUILD in SQL Server 2008 to fix heap fragmentation, you can, but it causes all the nonclustered indexes to be rebuilt as the heap record locations obviously change.
fixing heap fragmentation

все. каждый волен выбрать, кому верить, как переводить ALTER TABLE … REBUILD in SQL Server 2008 to fix heap fragmentation, как переводить you can.

P.S. it’s bad to use ALTER TABLE to rebuild a heap
означает, что это ДУРНОЙ СПОСОБ, а не "невозможность"
6 фев 14, 00:19    [15525771]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
gR4mm
Member

Откуда: Москва
Сообщений: 1412
MedBrat
gR4mm
Не только про индексы

пропущено...


Прошу прощения, т.е. для кучи требуется перестроение таблицы, а для таблицы содержащей кластерный индекс это равноценно rebuild кластерного индекса?
Для кучи, перестроение таблицы равносильно созданию на ней и последующее удаление кластерного индекса.
6 фев 14, 16:18    [15529709]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Коллеги, так подытожив... для чего существует REBUILD в моем случае?
если есть кластерный идекс - это его перестроение, как я понял, а если куча, то...

куча всеж перестраивается или не перестраивается или "дешевле" наложить кластерный идекс на нее и его же обслуживать?
6 фев 14, 16:19    [15529719]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
MedBrat
"дешевле" наложить кластерный идекс на нее и его же обслуживать?

да

If you run sys.dm_db_index_physical_stats (or my old DBCC SHOWCONTIG) on a heap (a table without a clustered index) and it shows some fragmentation, don't EVER create and drop a clustered index to build a nice, contiguous heap. Do yourself a favor and just create the well-chosen clustered index and leave it there – there's a ton of info out there on choosing a good clustering key – narrow+static+unique+ever-increasing is what you need.

ссылка приведена выше.
6 фев 14, 16:37    [15529882]     Ответить | Цитировать Сообщить модератору
 Re: Перестроение таблицы  [new]
o-o
Guest
+

сегодня руки дошли, вот эксперимент.
"как можно, но не нужно перестроить кучу"

предисловие
пытаясь выполнить
alter table dbo.nums rebuild

на 2000, получим
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'rebuild'.


но в 2008 ввели сжатие данных, в связи с чем теперь эта команда
не только не вызовет синтаксическую ошибку,
она выполнится.
будет создана новая куча, а старая убита
(что вызовет перестроение всех некластерных индексов, т.к. все RID-ы изменятся)


with cte as(
select number as n
from master..spt_values 
where type = 'P' and number < 1000
)

select c1.n * 1000 + c2.n + 1 as n
into dbo.nums
from cte c1 cross join cte c2;
--(1000000 row(s) affected)

delete 
from dbo.nums
where n % 3 = 0 or n % 2 = 0 
--(666667 row(s) affected)


select avg_fragmentation_in_percent,	
       fragment_count,	
       avg_fragment_size_in_pages,	
       page_count,	
       avg_page_space_used_in_percent,	
       record_count
from sys.dm_db_index_physical_stats
   (db_id() 
    , object_id('dbo.nums')
    , 0
    , null
    , 'detailed')
    
--avg_fragmentation_in_percent	fragment_count	avg_fragment_size_in_pages	page_count	avg_page_space_used_in_percent	record_count
--0.495049504950495	2	804.5	1609	43.4872251050161	333333

--alter table dbo.nums rebuild

select avg_fragmentation_in_percent,	
       fragment_count,	
       avg_fragment_size_in_pages,	
       page_count,	
       avg_page_space_used_in_percent,	
       record_count
from sys.dm_db_index_physical_stats
   (db_id() 
    , object_id('dbo.nums')
    , 0
    , null
    , 'detailed')
    
--avg_fragmentation_in_percent	fragment_count	avg_fragment_size_in_pages	page_count	avg_page_space_used_in_percent	record_count
--1.47058823529412	2	268.5	537	99.6728193723746	333333    


ивзиняюсь за бардак в голове и в изложении.
до этого написанное можно было понять, типа я на компрессию упираю.
компрессия тут только тем боком, что синтаксис ALTER TABLE-а расширили REBUILD-ом только для нее,
а не то что "ввели новый способ перестроения кучи"
но это не мешает использовать команду без упоминания компрессии,
она отрабатывает и на экспрессе, в к-ом нету сжатия

7 фев 14, 20:09    [15536782]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить