Как выбрать кластерный индекс в SQL Server?

Обычно кластерный индекс создается в Studio управления SQL Server путем устанавливания первичного ключа, однако мой недавний вопрос о PK <->, кластерный индекс (Значение Первичного ключа к Microsoft SQL Server 2008) показал, что не необходимо установить PK и кластерный индекс, чтобы быть равным.

Таким образом, как мы должны выбрать кластерные индексы затем? Давайте иметь следующий пример:

создайте таблицу Customers (идентификационный интервал...) создают таблицу Orders (идентификационный интервал, интервал CustomerID)

Мы обычно создавали бы PK/CI на обоих столбцах ID, но я думал о создании его для Заказов в CustomerID. Это - лучший выбор?

11
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Согласно Королеве индексирования - Кимберли Трипп - то, что она ищет в кластеризованном индексе, в первую очередь:

  • Уникальное
  • Узкое
  • Статическое

И если вы можете также гарантия:

  • Постоянно возрастающий паттерн

, значит, вы почти готовы получить идеальный ключ кластеризации!

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

Что-нибудь вроде INT (особенно INT IDENTITY) или, возможно, INT и DATETIME - идеальные кандидаты. По другим причинам GUID вообще не являются хорошими кандидатами - поэтому у вас может быть GUID в качестве ПК, но не кластеризовать на нем свою таблицу - он будет фрагментирован до неузнаваемости, и производительность пострадает.

13
ответ дан 3 December 2019 в 05:57
поделиться

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

функция суммы делителей , σ (n) = (сумма делителей n) , мультипликативная функция : для относительно главного m и n, мы имеем σ (млн) = σ (m) σ (n) , таким образом

σ (p1 k1... pr kr) = [(p1 k1+1-1) / (p1-1)]... [(pr kr+1-1) / (pr-1)].

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

BTW: несколько известных списков дружественных пар уже существуют (см., например, здесь и ссылки на MathWorld ) - так вы пытаетесь расширить запись, или делаете это просто ради удовольствия?

-121--1004864-

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

ROT: Кластер на том, что вы хотите показать коллекцию. Классическим примером являются отдельные предметы в заказе на поставку.

-121--2948875-

Лучший кандидат для индекса CLUSTERED - это ключ, который используется для наиболее частых ссылок на записи.

Обычно это PRIMARY KEY , поскольку это то, что используется в поиске и/или отношениях FOREIGN KEY .

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

При создании индекса CLUSTERED для Orders.CustomerID произойдет следующее:

  1. CustomerID не является уникальным. Для обеспечения уникальности к каждой записи добавляется специальный скрытый 32-разрядный столбец, называемый uniquifier .

  2. Записи в таблице будут храниться в соответствии с этой парой столбцов (CustomerID, uniquifier) .

  3. На Order.ID будет создан дополнительный индекс с (CustomerID, uniquifier) в качестве указателей записи.

  4. Запросы:

     SELECT *
    ОТ ЗАКАЗОВ
    ИДЕНТИФИКАТОР WHERE ID = 1234567
    

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

Для выполнения этой дополнительной операции требуется, чтобы IndexDepth считывалось столько же страниц, сколько Clustered Seek , IndexDepth beign O (регистрация (n)) от общего числа записей в таблице.

6
ответ дан 3 December 2019 в 05:57
поделиться

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

ROT: Составьте кластер по тому, что вы хотите показать. Классическим примером являются строчные позиции в заказе на поставку.

1
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

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