Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
Хорошего всем дня!

MS SQL Server 2008 R2

Есть таблица А, в которая имеются поля только типов uniqueidentifier, decimal(16,4), datetime(2) и int
То есть размер записи всегда фиксирован на сколько я себе это понимаю. никаких nvarchar нету.

Для поля id с типом uniqueidentifier есть кластерный уникальный индекс.
Новые данные в таблицу пишутся очень редко и для id uniqueidentifier используется DEFAULT NewSequentialId().

Но зато постоянно идут update этой таблицы по id.
Фрагментация индекса практически моментально становится 90% и больше.

Почему она происходит? ведь идёт только много uopdate'ов а записи таблицы одинаковой длины (или нет???). Сами id не трогаются. Добавление новых строк опустим, так как это очень редко и есть NewSequentialId();

P.S.
Избавится от uniqueidentifier в пользу int не предлагать.
Мне важно не столько избавится от фрагментации, сколько понять суть, почему она происходит.
31 авг 11, 12:09    [11205129]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Vovan_number_one,

скрипт таблицы и индексов в студию
31 авг 11, 12:24    [11205203]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
CREATE TABLE [dbo].[AnySet](
	[InnerId] [uniqueidentifier] NOT NULL,
	[MainId] [uniqueidentifier] NOT NULL,
	[Value1] [decimal](16, 4) NOT NULL,
	[Value2] [decimal](16, 4) NOT NULL,
	[Stamp] [datetimeoffset](2) NOT NULL,
	[Size1] [int] NOT NULL,
	[Size2] [int] NOT NULL,
 CONSTRAINT [PK_AnySet] PRIMARY KEY NONCLUSTERED 
(
	[InnerId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE UNIQUE CLUSTERED INDEX [IX_MAIN_ID] ON [dbo].[AnySet] 
(
	[MainId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

GO

Update и выборка производятся по MainId.
31 авг 11, 12:46    [11205360]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Vovan_number_one,

ну шо, кто первый глаза раскроет))
31 авг 11, 12:48    [11205367]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
табличный жук,

Всмысле? Косяк где-то? Я честно сказать не спец.
PK InnerId в таблице есть и индекс по нему некластерный. В моём случае он не нужен, но он есть.
31 авг 11, 12:50    [11205383]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Vovan_number_one, а почему вы решили кластерным сделать индекс по MainId, а не InnerId?
31 авг 11, 12:51    [11205392]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Vovan_number_one,

мне показалось что вы построили кластерный индекс по постоянно меняющемуся полю,не?
31 авг 11, 12:51    [11205393]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
Shakill
Vovan_number_one, а почему вы решили кластерным сделать индекс по MainId, а не InnerId?

Ну обновлять и выбирать данные надо именно по MainId хоть он и не PK.
InnerId нужен для другого. базу не я проектировал.
31 авг 11, 12:53    [11205418]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
табличный жук
Vovan_number_one,

мне показалось что вы построили кластерный индекс по постоянно меняющемуся полю,не?

MainId не меняется при апдейтах. Я имел ввиду что когда идет апдейт, то стоит where MainId = xxx
31 авг 11, 12:54    [11205425]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
iljy
Member

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

1. Как вы определяете степень фрагментации?
2. Сколько записей в таблице?
31 авг 11, 12:59    [11205461]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
таки при апдейт и инсерт фрагментация индекса всегда растёт
31 авг 11, 13:00    [11205475]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Vovan_number_one,

приношу извинения за ехидничанья - похоже я постановку не правильно понял.

есть два guid, оба в индексах, один из них кластерный,
в результате проводимых вами апдейтов ни один из этих гуидов не меняется, в результате кластерный становится фрагментированным. так?

триггеры е?
записей в таблице ско?
31 авг 11, 13:00    [11205478]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
iljy
Vovan_number_one,

1. Как вы определяете степень фрагментации?
2. Сколько записей в таблице?


1) Тупо делаю Rebuild индексу, смотрю через SSMS в свойства индекса фрагментацию. Она становится ~0%
Запускаю апдейты и она сразу начинает стремится к ~90%

2) Порядка 30 000
31 авг 11, 13:01    [11205482]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
табличный жук
триггеры е?
записей в таблице ско?

Не, триггеров нету.

Записей ~30 000
31 авг 11, 13:02    [11205490]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
табличный жук
Vovan_number_one,
приношу извинения за ехидничанья - похоже я постановку не правильно понял.

есть два guid, оба в индексах, один из них кластерный,
в результате проводимых вами апдейтов ни один из этих гуидов не меняется, в результате кластерный становится фрагментированным. так?

Да ничего!

Всё так!
31 авг 11, 13:02    [11205496]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
1d0
таки при апдейт и инсерт фрагментация индекса всегда растёт

В том и вопрос, почему растет при апдейтах? ведь строки фиксированной длины.
были бы не фикс. было бы понятно
31 авг 11, 13:03    [11205504]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
Вот дела.. глянул свойства индекса и там написано ещё:

Maximum row size: 87
Minimum row size: 73

Тут походу проблема.
С чего такое произошло? все типы фиксированные.. или нет?
31 авг 11, 13:06    [11205524]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
Vovan_number_one
1d0
таки при апдейт и инсерт фрагментация индекса всегда растёт

В том и вопрос, почему растет при апдейтах? ведь строки фиксированной длины.
были бы не фикс. было бы понятно


https://www.sql.ru/articles/mssql/03013101Indexes.shtml#17_1
31 авг 11, 13:09    [11205539]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Vovan_number_one,

апдейтите value1 и value2, в которых изначально нули или вроде того?
31 авг 11, 13:13    [11205557]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Табличный прыщ
Guest
Vovan_number_one
табличный жук,

Всмысле? Косяк где-то? Я честно сказать не спец.


он тоже не спец, успокойся.
когда посоветовать нечего обычно и просят скрипты создания таблицы время тянуть -
уже 17 постов а первый пост хоть сейчас задавать в чистом виде
31 авг 11, 13:13    [11205561]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
табличный жук,

вобще табличка крайне маленькая, может и просто цирковые показатели выдавать.
31 авг 11, 13:13    [11205565]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
табличный жук
Guest
Табличный прыщ,

ну раз для вас параметры хранения столбцов и свойства индексов значения не имеют, вполне можете себя похвалить за решительность и уверенность в себе ;)
31 авг 11, 13:15    [11205577]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Vovan_number_one
Вот дела.. глянул свойства индекса и там написано ещё:

Maximum row size: 87
Minimum row size: 73

Тут походу проблема.
С чего такое произошло? все типы фиксированные.. или нет?
VARDECIMAL включена?
31 авг 11, 13:16    [11205580]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

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

Vardecimal у таблицы false
31 авг 11, 13:22    [11205614]     Ответить | Цитировать Сообщить модератору
 Re: Фрагментация кластерного индекса (поле типа GUID) при Update. Почему она происходит?  [new]
Vovan_number_one
Member

Откуда:
Сообщений: 22
табличный жук
Vovan_number_one,

апдейтите value1 и value2, в которых изначально нули или вроде того?

Да нет, в основном не нули а похожие числа.
31 авг 11, 13:24    [11205623]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить