2010-01-26 3 views
8
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 секунды на моей машине и создает файл db, занимающий 392K. Эти цифры становятся 1,4 секунды и 864 К, если я меняю вторую линию наClustered vs NonClustered Primary Key

create table person_id(person_id integer nonclustered primary key); 

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

ответ

0

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

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

2

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

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

+0

Если бы я не планирую делать соединение, ни сканирование диапазона и заботился только о производительности вставки - будет ли лучше способ создать таблицу, чем первые примеры? –

+0

Если вы только заботились о производительности вставки, вы не должны использовать индексы вообще (если поддерживается) или записывать данные в текстовый файл. Добавление в текстовые файлы довольно быстро. – MarkR

0

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

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

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