Кластеризируемый по сравнению с первичным ключом NonClustered

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 секунды на моей машине и создает файл дб, поднимающий 392K. Эти числа становятся 1,4 секундами и 864K, если я изменяю вторую строку на

create table person_id(person_id integer nonclustered primary key);

Почему имеет место это?

9
задан Edward 3 December 2012 в 23:19
поделиться

3 ответа

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

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

0
ответ дан 4 December 2019 в 23:39
поделиться

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

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

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

0
ответ дан 4 December 2019 в 23:39
поделиться

Можно сделать MyStartBase абстрактным, чтобы он не пытался запустить тесты в базовом классе. Лучшим решением было бы иметь setUp в базовом классе и вызвать абстрактные методы (например, getFoo () ) для инициализации переменных, которые потребуются позже.

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

-121--4321168-

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

Мы могли бы назвать это описание богатства (под описанием богатства я подразумеваю "этот бит текста полужирный" или "этот бит текста является гиперссылкой), мы могли бы назвать это описание богатства" разметкой "- она помечает текст мета-" богатством ".

Реализация форматированного текста может иметь два подхода: а) скрыть разметку от пользователя или б) предоставить им доступ к разметке.

Для тех, кто решил скрыть его, конечным результатом очень часто является WYSIWYG. Пользователь забывает о том, что происходит за кадром. О деталях заботится редактор. Рассмотрим MS Word в качестве примера. Никто не манипулирует форматом разметки Word как обычный конечный пользователь.

Для реализаций, которые выбирают для раскрытия разметки, язык разметки используется для того, чтобы позволить пользователям взаимодействовать с ней. Такими языками разметки могут быть HTML, например, < tag > или BB-код, например, [тэги] .

Одним из этих языков является уценка.

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

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

В большинстве систем, которые я построил, я сохраняю уценку, а затем нормализую ее до второго поля, которое кэширует HTML-рендеринг уценки. Таким образом, мне не нужно выполнять рендеринг markdown- > HTML для каждого поля уценки. Это занимает немного больше места, но я бы предпочел, чтобы у пользователя был более быстрый ответ, чем использование меньшего пространства для места хранения БД.

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

-121--2875900-

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

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

2
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: