Ключ кластеризации переходит в дерево с некластеризованным индексом в SQL Server

Кажется, в SQL Server до версии 2019 ключ/ключи кластеризации восходят к древовидной структуре с неуникальным некластеризованным индексом. С большим и множественным ключом/ключами кластеризации вы получаете гораздо более широкое и высокое дерево, которое стоит вам большего размера хранилища и памяти.

Из-за этого мы использовали для отделения PK от кластерного ключа, мои вопросы

  1. Изменились ли SQL Server 2019 и Azure в некластерном индексировании или нет?
  2. Кучи вообще не имеют ключа/ключей кластеризации, каков способ индексации в кучах?

person ali tekrar    schedule 16.06.2020    source источник
comment
Ваш вопрос неясен относительно того, что означает древовидная структура. Ключ кластеризованного индекса хранится в конечных узлах некластеризованных индексов в качестве локатора строк, а не в неконечных узлах. В случае кучи локатором строк является RID (файл/страница/слот). Я не верю, что архитектура SQL 2019 изменилась.   -  person Dan Guzman    schedule 16.06.2020
comment
спасибо, но когда мы используем не уникальный некластеризованный индекс, ключ кластерного индекса идет к корню, и вы можете увидеть его в своей базе данных, просто используйте EXEC('DBCC IND([OutputTableName], "[yourtable]" , index you interested in) Select [IndexLevel],[PagePID] From [IndexPagesOutput] Order BY [IndexLevel] DESC , чтобы найти свою корневую страницу, затем DBCC TRACEON (3604); DBCC PAGE(OutputTableName , 1 , root page number , index you interested in) это ваша корневая страница, и на этой странице вы может видеть ваш неуникальный некластеризованный индекс и ключ кластеризованного индекса, который вы используете   -  person ali tekrar    schedule 16.06.2020


Ответы (1)


Изменились ли SQL Server 2019 и Azure в некластеризованном индексировании или нет

Такое поведение старше многих людей на этом сайте.

Из-за этого мы привыкли отделять PK от кластеризованных

Это почти всегда ненужная микрооптимизация.

Кучи вообще не имеют ключа/ключей кластеризации, каков способ индексации в кучах

Некластеризованные неуникальные индексы всегда имеют локатор строк в качестве ключей индекса. Для куч локатором строк является ROWID (FileNo, PageNo, SlotNo).

Если вы хотите переместить строки с конечного уровня вашего широкого ПК, это обычно для очень большой таблицы. Поэтому перемещение строк в кластеризованный индекс columstore может быть хорошим вариантом. Для этого просто удалите кластеризованный ПК (при этом конечный уровень останется в виде кучи), создайте CCI, а затем заново создайте ПК как некластеризованный ПК. например

drop table if exists t
go
create table t(id int not null, a int, b int)

alter table t 
  add constraint pk_t 
  primary key clustered(id)

go

alter table t drop constraint pk_t

create clustered columnstore index cci_t on t

alter table t 
  add constraint pk_t 
  primary key nonclustered (id)

И если у вас есть другие некластеризованные индексы, сначала удалите их и воссоздайте послесловие только в том случае, если вам это действительно нужно. Уникальные индексы IE, индексы, поддерживающие внешний ключ, или индексы должны поддерживать определенные запросы. CCI обычно не нуждается в большом количестве индексов, так как он очень эффективен для сканирования.

person David Browne - Microsoft    schedule 16.06.2020
comment
Это почти всегда ненужная микрооптимизация, почему? например, когда мы используем несколько guid fk для pk , эти множественные guid восходят к дереву с каждым не уникальным некластеризованным индексом, и если у нас их несколько, размер дерева становится больше, чем исходная таблица - person ali tekrar; 16.06.2020
comment
Да, но насколько это важно? Можете ли вы измерить это реалистичным способом? Сколько дополнительных индексов создается? - person David Browne - Microsoft; 16.06.2020
comment
когда у нас есть более миллиона записей, они становятся все больше и больше, им требуется все больше и больше места для хранения и объема памяти, тогда производительность становится настолько плохой, что никто больше не хочет ее использовать, и для чего? просто не отделяйте ПК от кластерного ключа - person ali tekrar; 16.06.2020
comment
Но у вас все еще есть индекс с широкими ключами. Вы только что переместили строки данных на конечный уровень другого индекса. - person David Browne - Microsoft; 16.06.2020
comment
в том-то и дело, а ты так говоришь, как будто это хорошо, это ненужно и надоедливо - person ali tekrar; 16.06.2020
comment
Вы предлагаете ввести дополнительный индекс для оптимизации других некластеризованных индексов. Это компромисс. Иногда это хорошая идея. Чаще нет. Часто лучше просто использовать Heap или Clustered Columnstore для основного хранилища строк. - person David Browne - Microsoft; 16.06.2020
comment
Я еще не использую Clustered Columnstore, поддерживает ли его ядро ​​ef? если да, пришлите ссылку как им пользоваться - person ali tekrar; 16.06.2020
comment
Я обновил свой ответ примером перехода от кластеризованного ПК к некластеризованному ПК + кластерному индексу Columnstore. - person David Browne - Microsoft; 16.06.2020
comment
спасибо за ваше время, это невозможно с ядром ef? - person ali tekrar; 16.06.2020