2013-11-10 2 views
0

У меня есть много, чтобы многие таблицы ссылка CategoryProduct с 2-мя колоннами, которые будут иметь многомиллионные записи:SQL производительность запросов сервера на кластерный индекс с композитными полями

CREATE TABLE [dbo].[CategoryProduct](
[Category_ID] [int] NOT NULL, 
[Product_ID] [int] NOT NULL, 
CONSTRAINT [PK_dbo.CategoryProduct] PRIMARY KEY CLUSTERED 
(
    [Category_ID] ASC, 
    [Product_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

На основе кластерного индекса, я ожидал см физические записи, которые должны храниться в следующей структуре:

CategoryID ProductID 
1    2 
1    3 
2    1 
2    3 

Однако результат с Select является

CategoryID ProductID 
2    1 
1    2 
1    3 
2    3 

Почему данные хранятся в группе ProductID? Отражает ли это фактический порядок данных? Как сохранить данные в группе CategoryID, чтобы можно было оптимизировать такой запрос, как показано ниже, с последовательным чтением при попадании соответствующего идентификатора категории.

select ProductID from CategoryProduct where CategoryID = value 
+0

Почему бы не отсортировать по категории id? –

+0

@DoobyInc Я обновил свой вопрос. – mortdale

+0

Вы просто хотите заказать по категории ID или что-то еще? ЕСЛИ вы просто хотите заказать по категории Id, то почему бы вам не использовать заказ по ключевому слову в конце вашего оператора select в SQL? –

ответ

3

Когда Sql Server выборки данных, выполнив сканирование таблицы или кластерного индекс сканирование (если таблица кластерный), может выбрать следовать листовым страницам СЦЕПЛЕНИЯ из поисковых аргументов, запорные намеков и других параметров, или он может следуйте карте распределения индекса, которая в большинстве случаев не находится в том же порядке из-за разбиений страниц, которые произошли.

Использование кластерного индекса не является гарантией скорости, сервер Sql вычисляет способ получения данных для каждого запроса даже для простых запросов (оптимизатор Sql Query - очень сложная система).

Это не способ получить данные в определенном порядке либо, единственный способ , чтобы получить данные в определенном порядке, чтобы указать предложения ORDER BY в запросе (это спецификация ANSI).

Если вы хотите улучшить производительность, вам следует изучить план запроса вашего запроса. Существует несколько способов получить план запроса вашего запроса, самым простым является выбор кнопки «Включить фактический запрос» в панели инструментов Sql Magenement Studio перед выполнением вашего запроса.

Последующее наблюдение: с кластеризованным индексом, данные физически хранятся в порядке определения кластера, пока кластер не будет фрагментирован. ТОЛЬКО способ получить данные в определенном порядке в SELECT - это добавить ORDER BY к SELECT, не создавая индексы.

+0

Причина, по которой я хочу сохранить данные в группе CategoryID, должна иметь последовательное чтение, когда попадает соответствующий идентификатор категории. Предполагая, что CategoryID 1 имеет 2 продукта с ProductID 1 и 10000000, если данные хранятся в группе CategoryID, мне просто нужно прочитать первые 2 записи, чтобы получить результат. – mortdale

+0

@mortdale, вы совершенно правы, чтобы скопировать данные в CategoryId, ProductId. Дело в том, что создание индекса кластера в этих полях не гарантирует, что вы получите их в этом порядке, если вы не добавите предложение ORDER BY в ваш SELECT, даже если они «сохранены в этом порядке». – ARA

+0

Означает ли это, что данные физически сохранены в соответствии с кластеризованным индексом? Это просто мой выбор, не отражающий фактический порядок данных? – mortdale

1

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

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

+0

. Мой вопрос заключается в том, как повысить производительность с помощью кластерного индекса. Однако кластеризованный индекс, который я создал, не дал структуру, которую я хотел. – mortdale

+0

Каким образом это не так? – Szymon

Смежные вопросы