我在某处读过,可以选择在主键创建的树叶上存储其他数据。 例如, 如果我有一个包含列的表:row_id,customer_id 我需要显示customer_name,我可以在我的表和customers表之间进行连接。但我也可以使用customers表的主键(带有customer_id)存储customer_name,并且sql引擎不必加载整行客户以便获取客户名称。
有人可以更好地描述它吗? 我该如何实现呢?
答案 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的答案)