Составной Первичный ключ должен кластеризироваться в SQL Server?

В Python для выделения блоков используются отступы от пробелов, а не фигурные скобки или ключевые слова. Не похоже, что создатели VSC Jupyter Extension старались изо всех сил обойти это.

Один хак - это добавить выражение true if в начале вашей ячейки, например:

#%%
if 1:  # indent for emphasis
    print('This works')
10
задан Mehrdad Afshari 23 December 2008 в 16:56
поделиться

5 ответов

Как был уже сказан несколькими другими, это зависит от того, как Вы получите доступ к таблице. Следует иметь в виду, хотя, что любой RDBMS там должен смочь использовать кластерный индекс для поиска отдельным столбцом, пока тот столбец кажется первым. Например, если Ваш кластерный индекс идет (parent_id, child_id), Вам не нужен другой отдельный индекс на (parent_id).

Ваш лучший выбор может быть кластерным индексом на (parent_id, child_id), который также, оказывается, первичный ключ с отдельным некластерным индексом на (child_id).

В конечном счете индексация должна быть обращена после понимания то, как к базе данных получат доступ. Придуманный некоторые стандартные стресс-тесты производительности, если Вы можете и затем анализировать поведение с помощью профильного инструмента (SQL Profiler для SQL Server) и мелодия производительности оттуда. Если у Вас нет экспертных знаний или знания, чтобы сделать это заранее, то попробуйте за (надо надеяться, ограниченный) выпуск приложения, соберите метрики производительности и посмотрите, где необходимо улучшить производительность и выяснить то, чему помогут индексы.

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

В Вашем случае я, вероятно, просто поставил бы кластеризованный PK (parent_id, child_id), чтобы запуститься с и затем добавить некластерный индекс, только если я видел проблему производительности, которой поможет он.

12
ответ дан 3 December 2019 в 19:36
поделиться

Реальный вопрос здесь - то, что Вы будете запрашивать на большинстве? Если Вы будете искать оба значения все время, то кластеризованное должно быть на паре. Если бы Вы собираетесь запросить в большей степени на одном, или другой Вы хотели бы кластеризованное на том определенном.

2
ответ дан 3 December 2019 в 19:36
поделиться

Так как Вы говорите, что "я полагаю, что составной первичный ключ" - там все еще мог бы быть пора передумать. Я использовал много составных ключей, и я продолжаю находить, что причины жаль, что я не имел. Возможно, другие не согласятся со мной.

Я соглашаюсь с ответом Mitchel, кластер идет на то, на чем Вы будете запрашивать чаще всего.

0
ответ дан 3 December 2019 в 19:36
поделиться

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

Что касается того, что кластеризироваться, необходимо думать, как таблица будет лучше всего использоваться. Если Ваша таблица подвергается большому количеству запросов диапазона (ГДЕ col1 МЕЖДУ a, И b) затем кластеризируют таблицу так, чтобы запросы диапазона были уже настроены в порядке на диск. В SQL Server иногда мы получаем кластер бесплатно с PKs, и мы забываем о том, что является лучшим для кластеризации для начала.

Что касается ограничений FK на таблицу, так как Вы сказали, что больше чтений, чем записи это может быть приемлемо. Если это было таблицей с большим количеством вставок, каждое ограничение FK требует проверки против родительской таблицы, и это не могло бы дать Вам производительность, которой Вы требуете.

Большой вопрос.

0
ответ дан 3 December 2019 в 19:36
поделиться

"На чем Вы запрашиваете чаще всего", не обязательно лучшая причина выбрать индекс для кластеризации. Что имеет значение, больше всего то, на чем Вы запрашиваете получить несколько строк. Кластеризация является стратегией, подходящей для того, чтобы сделать эффективным получить несколько строк в наименьшем количестве количества чтения с диска.

Лучшим примером является история продаж для клиента.

Скажите, что у Вас есть два индекса на Таблице sales, один на Клиенте (и возможно дата, но точка применяется так или иначе). Если Вы будете чаще всего запрашивать таблицу на CustomerID, то Вы захотите, чтобы записи всего клиента Продаж вместе дали Вам одно или два чтения с диска для всех записей.

Первичный ключ, OTOH, мог бы быть суррогатным ключом или SalesId, - но уникальное значение в любом случае. Если бы это кластеризировалось, то это не имело бы выгоды по сравнению с нормальным уникальным индексом.

Править: Давайте возьмем эту конкретную таблицу для обсуждения - это покажет еще больше тонкости.

"Естественный" первичный ключ, по всей вероятности, порождается + childid. Но в какой последовательность? Parentid + childid не более уникален, чем childid + порожденный. Для кластеризации целей, какое упорядочивание является более соответствующим? Можно было бы предположить, что это должно быть порождено + childid, так как мы захотим спросить: "Для данного объекта, каковы его составляющие"? Но это вряд ли не захочет идти другим путем и просить "Данный constuent, того, какие объекты это - компонент?".

Добавьте при рассмотрении "покрытия индексов", которые содержат в индексе, вся информация должна была удовлетворить запрос. Если это правда, то Вы никогда не должны читать остальную часть записи; так кластеризация не имеет выгоды; просто чтение индекса достаточно. (BTW, который означает два индекса на той же паре полей в противоположном порядке; который может быть правильным поступком в случаях как это. Или по крайней мере сводный индекс на одном и единственное поле индексируют на другом.)

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

Даже для такого ясного примера, в принципе лучше оставлять decidintg о других индексах, пока Вы не можете протестировать их с реалистическими данными (очевидно, перед производством); но просьба здесь о предположении бессмысленна. Тестирование всегда будет давать Вам надлежащий ответ.

Забудьте волноваться о замедлении, вставляет, пока у Вас нет проблемы (которого в большинстве случаев никогда не будет происходить), и может протестировать для проверки, бросив полезные индексы для измеримого преимущества.

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

BTW, я ожидал бы, что это закончится с PK на порожденном + childid; групповой индекс на childid; и кластеризируемое первое. Если Вы предпочтете суррогатный PK, то Вы все еще захотите уникальный индекс на порожденном + childid, кластеризируемый. Кластеризация суррогатного ключа очень вряд ли будет оптимальна.

6
ответ дан 3 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

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