Кластерный против некластерного первичного ключа - PullRequest
9 голосов
/ 26 января 2010
begin transaction;
create table person_id(person_id integer primary key);
insert into person_id values(1);
... snip ...
insert into person_id values(50000);
commit;

Этот код занимает около 0,9 секунды на моем компьютере и создает файл БД, занимающий 392 КБ. Эти цифры становятся 1,4 секунды и 864K, если я изменю вторую строку на

create table person_id(person_id integer nonclustered primary key);

Почему это так?

Ответы [ 4 ]

4 голосов
/ 12 марта 2013

Отличный ответ на этот вопрос доступен в DBA StackExchange: https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered/7744#7744

2 голосов
/ 26 января 2010

Кластеризация первичного ключа сохраняет его со строками; это означает, что он занимает меньше места (так как нет отдельных блоков индекса). Однако, как правило, его основное преимущество заключается в том, что при сканировании диапазона можно получить доступ к строкам, которые находятся в одном и том же блоке, что сокращает число операций ввода-вывода, что становится довольно важным, если у вас большой набор данных (не 50 тыс. Дюймов).

Я думаю, что 50 тыс. Дюймов - это довольно искусственный эталон, а не тот, который вас волнует в реальном мире.

0 голосов
/ 26 января 2010

Я рандомизировал операторы вставки и повторно сделал запрос со значениями от одного до полумиллиона. Интересно, что и кластеризованные, и некластеризованные файлы БД теперь занимают точное количество места (вплоть до байта). Однако вставки в кластеризованную базу данных все еще быстрее.

Для меня это противоречит интуиции. Когда я сообщаю кластеру базы данных эти значения - я говорю базе данных ... эти значения должны быть в таком порядке, когда я вернусь, чтобы получить их. Когда у меня нет спецификации, я, по сути, говорю БД - посмотрите, возьмите эти значения и расположите их так, как вам нравится - все, что делает вашу жизнь проще.

Теоретически, эта дополнительная свобода никогда не должна замедлять запросы. Возможно, не ускорять их все время, но никогда не замедлять. Мысли? * * 1005

0 голосов
/ 26 января 2010

[Только как идея]

Может быть, когда вы явно указываете брать столбцы целых чисел в качестве кластеризованного ключа, он делает именно это. Но когда вы говорите ему не использовать столбец целых чисел, он все равно создает закулисный индекс, но выбирает другой тип данных для этого, предположим, в два раза больше. Затем каждая из этих записей должна ссылаться на записи в таблице, и вот, пожалуйста, размер увеличивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...