2013-12-20 6 views
4

У меня есть база данных, где все таблицы включают столбец Site (char(4)) и столбец PrimaryId (int).Составной кластеризованный индекс против неуникального кластеризованного индекса. Что лучше/хуже в этом случае?

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

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

В случае, если это имеет значение, обычно не будет более нескольких сайтов. 10 сайтов будет много.

+1

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

+0

Спасибо @Damien_The_Unbeliever. С базой данных, которую я использую на данный момент, это определенно быстрее. Просто пытаюсь найти баланс между проведением собственного тестирования и получением от других. Не хотите тратить слишком много времени, если кто-то может дать небольшое руководство :) – BVernon

+0

, в какой колонке в основном используется поле where where или fieldid? Я думаю, что один из них наиболее часто используется, когда условие должно быть кластеризованным индексом. – KumarHarsh

ответ

6

Ответ простой УНИКАЛЬНЫЙ индекс всегда лучше, чем НЕ-УНИКАЛЬНЫЙ. За этим стоит математика, но большая уникальность заключается в том, что более быстрый сервер может искать запись из индекса.

CLUSTERED индекс замечательный, поскольку они физически упорядочивают записи на диске, и всегда полезно использовать CLUSTERED INDEX для UNIQUE ключей.

ИНДЕКС КЛАСТЕРА с ПЕРВИЧНЫМ КЛЮЧОМ дает очень хорошую производительность с большими данными. Если ваши данные невелики в столбце, это не имеет большого значения.

+0

Да, я просто заметил, что некоторые запросы выполнялись быстрее, когда я переключил их только на PrimaryId. Но моя тестовая база данных не обязательно является хорошим образцом того, что все используют так ... вот почему я спрашиваю. Спасибо за ваш вклад. – BVernon

+2

На самом деле: в SQL Server кластеризованный индекс ** должен быть ** уникальным (потому что так будет располагаться каждая строка в таблице, поэтому он должен найти каждую отдельную строку отдельно). Если вы не сделаете его уникальным, SQL Server добавит к нему 4-байтовый ** uniquefier ** «скрытый» столбец, чтобы сделать его уникальным. –

2

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

Есть два типа таблиц (в контексте индексов):

  • кучи - таблица без кластерного индекса
  • кластерный индекс - таблица с кластерным индексом

В в первом случае некластеризованный индекс соответствует строкам с использованием закладок на основе RIP, который имеет следующий формат:

file number - page number - row number 

и некластерный индекс выглядит так:

enter image description here

Вы можете увидеть RIP закладку в красном цвете.

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

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

  1. он должен быть уникальным
  2. его должен быть коротким
  3. он должен быть статическим

Я собираюсь d описывать круг первые критерии (остальные описанные в ссылке ниже):

Каждый индекс начального закладки должен позволить SQL Server, чтобы найти одну строку в таблицу, которая соответствует этой записи. Если вы создадите кластерный индекс , который не является уникальным, SQL Server сделает кластеризованный индекс уникальным, генерируя дополнительное значение, которое «разрывает связь» для дубликатов ключей . Это дополнительное значение генерируется SQL Server для создания Уникальность называется уникальным и прозрачна для любого клиента . Вы должны тщательно рассмотреть вопрос о целесообразности или не допускать дубликатов в кластерном индексе, по следующим причинам:

  1. Генерирующего uniquifiers это дополнительные накладные расходы. SQL Server должен решить, на этапе время вставки, если ключ новой строки является дубликатом ключа существующей строки; и, если это так, генерируют значения уникального знака для добавления в новую строку

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

Вся статья может быть найдена here.