Обычно кластерный индекс создается в Studio управления SQL Server путем устанавливания первичного ключа, однако мой недавний вопрос о PK <->, кластерный индекс (Значение Первичного ключа к Microsoft SQL Server 2008) показал, что не необходимо установить PK и кластерный индекс, чтобы быть равным.
Таким образом, как мы должны выбрать кластерные индексы затем? Давайте иметь следующий пример:
создайте таблицу Customers (идентификационный интервал...) создают таблицу Orders (идентификационный интервал, интервал CustomerID)
Мы обычно создавали бы PK/CI на обоих столбцах ID, но я думал о создании его для Заказов в CustomerID. Это - лучший выбор?
Согласно Королеве индексирования - Кимберли Трипп - то, что она ищет в кластеризованном индексе, в первую очередь:
И если вы можете также гарантия:
, значит, вы почти готовы получить идеальный ключ кластеризации!
Ознакомьтесь со всем ее сообщением в блоге здесь и еще одним действительно интересным сообщением о влиянии клавиш кластеризации на операции с таблицами здесь: Дебаты по кластеризованному индексу продолжаются .
Что-нибудь вроде INT (особенно INT IDENTITY) или, возможно, INT и DATETIME - идеальные кандидаты. По другим причинам GUID вообще не являются хорошими кандидатами - поэтому у вас может быть GUID в качестве ПК, но не кластеризовать на нем свою таблицу - он будет фрагментирован до неузнаваемости, и производительность пострадает.
Вопрос в названии (и последней строке), кажется, имеет мало общего с фактическим телом вопроса. Если вы пытаетесь найти полюбовные пары, или вычислить сумму делителей для многих чисел, то раздельное факторирование каждого числа (даже при самом быстром из возможных алгоритмов) - абсолютно неэффективный способ сделать это.
функция суммы делителей , σ (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
произойдет следующее:
CustomerID
не является уникальным. Для обеспечения уникальности к каждой записи добавляется специальный скрытый 32-разрядный
столбец, называемый uniquifier
.
Записи в таблице будут храниться в соответствии с этой парой столбцов (CustomerID, uniquifier)
.
На Order.ID
будет создан дополнительный индекс с (CustomerID, uniquifier)
в качестве указателей записи.
Запросы:
SELECT *
ОТ ЗАКАЗОВ
ИДЕНТИФИКАТОР WHERE ID = 1234567
придется выполнить внешнюю операцию, кластерный поиск
, так как не все столбцы хранятся в индексе на ID
. Чтобы получить все столбцы, запись должна быть сначала расположена в кластеризованной таблице.
Для выполнения этой дополнительной операции требуется, чтобы IndexDepth
считывалось столько же страниц, сколько Clustered Seek
, IndexDepth
beign O (регистрация (n))
от общего числа записей в таблице.
Если вас интересует кластеризация, то обычно это делается для улучшения поиска данных. В вашем примере вы, вероятно, захотите получить все записи для данного клиента сразу. Кластеризация по идентификатору клиента позволит сохранить эти строки на одной физической странице, а не разбросанными по нескольким страницам файла.
ROT: Составьте кластер по тому, что вы хотите показать. Классическим примером являются строчные позиции в заказе на поставку.