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

Откуда: Саратов
Сообщений: 1140
Всем привет! Поправьте меня если я не прав. Мысли в слух...
1. При создании кластерного индекса, данные в таблице упорядочиваются и новые данные добавляются в конец индекса(таблицы).
2. Кластерный индекс я создаю по автоинкрементному полю тип integer, порядок сортировки asc. Соответственно чем новее данные тем дальше они от начала таблицы.
3. В таблице есть поле "дата", это дата добавления строки в таблицу, таблица заполняется несколько лет, соответственно если мне нужны данные за вчерашний день, то мне нужно достать данные из конца индекса(таблицы).
4. Если я переделаю сортировку в кластерном индексе на desc, то я ускорю получение информации которая записывалась недавно, например за вчерашний день.

Правильно я рассуждаю?
28 окт 19, 18:12    [22004509]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста как правильно построить кластерный индекс.  [new]
msLex
Member

Откуда:
Сообщений: 7726
Mandarin
1. При создании кластерного индекса, данные в таблице упорядочиваются и новые данные добавляются в конец индекса(таблицы).

Нет, новые данные попадают в то место кластерного индекса, куда указывает ключ у вставляемых записей
В частном случае, если ключ монотонно возрастающий, да, в конец индекса.

Mandarin
2. Кластерный индекс я создаю по автоинкрементному полю тип integer, порядок сортировки asc. Соответственно чем новее данные тем дальше они от начала таблицы.

Да

Mandarin
3. В таблице есть поле "дата", это дата добавления строки в таблицу, таблица заполняется несколько лет, соответственно если мне нужны данные за вчерашний день, то мне нужно достать данные из конца индекса(таблицы).

Да

Mandarin
4. Если я переделаю сортировку в кластерном индексе на desc, то я ускорю получение информации которая записывалась недавно, например за вчерашний день.

Зависит от того, как вы будете читать эти данные.

Например, при ask сортировке

select top 1 *
from ...
where 
insert_date = %сегодня%
order by id 

будет сканить почти всю таблицу



select top 1 *
from ...
where 
insert_date = %сегодня%
order by id desc

просканит только последние страницы


select top 1 *
from ...
where 
id = ...

вообще не зависит от сортировки, и всегда считает только по 1-й странице с каждого уровня дерева индекс.

Сообщение было отредактировано: 28 окт 19, 18:25
28 окт 19, 18:21    [22004514]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста как правильно построить кластерный индекс.  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1140
msLex,

Первичный ключ (кластерный индекс) монотонный автоинкремент.
Выборку данных буду делать так
select * from table where field_date betwee @d1 and @d1

Где @d1 и @d1 ближайшие к нам даты.
Индекс по полю field_date есть.
Как будет быстрее работать, когда кластерный индекс сортируется по asc или по desc?
28 окт 19, 18:25    [22004516]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста как правильно построить кластерный индекс.  [new]
msLex
Member

Откуда:
Сообщений: 7726
Mandarin
msLex,

Первичный ключ (кластерный индекс) монотонный автоинкремент.
Выборку данных буду делать так
select * from table where field_date betwee @d1 and @d1


Где @d1 и @d1 ближайшие к нам даты.
Индекс по полю field_date есть.
Как будет быстрее работать, когда кластерный индекс сортируется по asc или по desc?


Без разницы.
У вас будет либо full scan кластерного, либо range scan некластерного с lookup-ом в кластерный.
28 окт 19, 18:28    [22004518]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста как правильно построить кластерный индекс.  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1140
msLex,

Понятно, спасибо.
28 окт 19, 18:37    [22004520]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить