带有附加数据的主键

时间:2011-02-22 15:47:07

标签: sql sql-server sql-server-2005 tsql

我在某处读过,可以选择在主键创建的树叶上存储其他数据。 例如, 如果我有一个包含列的表:row_id,customer_id 我需要显示customer_name,我可以在我的表和customers表之间进行连接。但我也可以使用customers表的主键(带有customer_id)存储customer_name,并且sql引擎不必加载整行客户以便获取客户名称。

有人可以更好地描述它吗? 我该如何实现呢?

4 个答案:

答案 0 :(得分:5)

对于SQL Server 2005+,听起来好像是在讨论included columns,但这只适用于所有列都在一个表中的情况。

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

但是,我认为你描述的情况是(row_id,customer_id)在一个表中,而customer_name在第二个表中。对于这种情况,您需要创建indexed view

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 :(得分:1)

MSDN文章很好地解释了

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

基本上,当它从索引中获取数据(基于你的where子句)而不是必须再次访问表以获取附加数据时,索引会返回已作为索引的一部分包含的数据。

重要的是要注意,包含的列不构成用于搜索目的的索引,但它们会影响索引的大小,因此会占用更多的内存空间。

Joe已经获得了实现它所需的语法。

答案 2 :(得分:0)

仅供参考:请注意,您不能在聚簇索引上添加包含的列,因为聚簇索引首先不是真正的索引 - 它只是数据的b树。在某些情况下,使用堆和几个有效的覆盖索引(可能包含列)可能会更好。

因此,如果您的主键也是聚集索引,则不包括列...

答案 3 :(得分:0)

INCLUDE只能覆盖非聚集索引。这里,包含的列位于索引的最低级别。这避免了所谓的密钥(SQL Server 2000中的书签)查找聚簇索引

聚簇索引自动覆盖:索引的最低叶级别数据。默认情况下,PK在SQL Server中集群。

这适用于同一张表。

要在表格中执行此操作,您需要一个索引视图(并参阅Joe的答案)