первичный ключ с дополнительными данными - PullRequest
5 голосов
/ 22 февраля 2011

Я где-то читал, что есть возможность хранить дополнительные данные на листьях дерева, созданного первичным ключом.Например, если у меня есть таблица со столбцами: row_id, customer_id и мне нужно отобразить customer_name, я могу сделать соединение между моей таблицей и таблицей клиентов.Но я также могу сохранить customer_name с первичным ключом таблицы customer (с customer_id), и движку sql не придется загружать всю строку customer, чтобы найти имя клиента.

Может кто-нибудь это описатьлучше?Как я могу это реализовать?

Ответы [ 4 ]

5 голосов
/ 22 февраля 2011

Для SQL Server 2005+ звучит так, будто вы говорите о включенных столбцах , но это работает только тогда, когда все столбцы находятся в одной таблице.

CREATE INDEX IX_Customers_RowCust
ON Customers (customer_id)
INCLUDE (customer_name);

Но, я думаю, вы описываете ситуацию, когда (row_id, customer_id) находятся в одной таблице, а customer_name - во второй таблице. Для этой ситуации вам нужно создать индексированное представление .

CREATE VIEW vwCust WITH SCHEMABINDING AS 
    SELECT t.row_id, t.customer_id, c.customer_name
        FROM SomeTable t
            INNER JOIN Customers c
                ON t.customer_id = c.customer_id
GO
CREATE UNIQUE CLUSTERED INDEX vwCustRow ON vwCust (row_id)
GO
1 голос
/ 22 февраля 2011

В статье MSDN это объясняется очень хорошо

http://msdn.microsoft.com/en-us/library/ms190806.aspx

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

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

У Джо есть синтаксис, необходимый для его реализации.

0 голосов
/ 22 февраля 2011

Только некластеризованный индекс может быть выполнен с помощью INCLUDE. Здесь включенные столбцы находятся на самом низком уровне индекса. Это позволяет избежать так называемого поиска ключа (закладки в SQL Server 2000) в кластеризованном индексе

Кластерный индекс покрывает автоматически: самый низкий конечный уровень индекса равен данным. По умолчанию PK кластеризован в SQL Server.

Это относится к той же таблице.

Чтобы сделать это по таблицам, вам нужно индексированное представление (и посмотрите ответ Джо)

0 голосов
/ 22 февраля 2011

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

Так что, если ваш первичный ключ также является кластерным индексом, нет включенных столбцов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...