如何最好地将表中的列与其他表的动态关系建立索引?

时间:2015-09-11 19:31:44

标签: sql-server indexing

我们的一些表与其他表有动态关系。

例如,

- 我们有一个存储所有地址的地址表,其中有两个“链接”字段entity_id和entity_key_id,用于将地址链接到其他表。

例如'member'可能是entity_id 1,'organization'可能是实体id 2,所以如果我们存储一个成员地址,那行将具有entity_id = 1和entity_key_id = mem_id(mem表的pk),但是如果我们存储一个组织地址,那么该行将具有entity_id = 2,而entity_key_id将存储该组织地址的pk。)

我如何最好将其编入索引?我应该有2个索引 - 一个用于entity_id,一个用于entity_key_id?或者将两列都包含在一个索引中会更好,如果是,按什么顺序?

db是SQL Server 2008 R2

2 个答案:

答案 0 :(得分:0)

更简洁的方法是拥有两个不同的键mem_key_idorg_key_id。这不仅允许您在每个索引上创建索引,还可以声明正确的外键约束。

两个键中的一个总是为空。

答案 1 :(得分:0)

It depends on queries you are going to run against this database. You can use Tuning Adviser ( https://msdn.microsoft.com/en-us/library/ms166575(v=sql.100).aspx),这会有所帮助。

但通常你应该按照用于谓词(WHERE)的顺序和你选择的列的索引。以下是一些例子。

SELECT ... from table1 where table1.column1=.. and table1.column2=..

此处您应该拥有column1, column2索引,因此数据库将能够首先直接从索引中找到所有column1,然后找到所有column2。您可能还有column1索引,但在这种情况下,DB将首先从索引中读取column1,然后转到表本身,这样会更慢。

但是如果你的column2, column42, column1索引不会被使用,因为DB无法遵循你的WHERE条件。

在索引中包含列也很好。

使用索引select column1 from table1 where column2=...运行column2, column1将使DB能够从索引读取这两列,甚至不触摸表!它很快。但是,如果您更改此索引中的顺序,则不会使用它,因为数据库需要column2(根据WHERE)。

您应该始终分析器来获取执行计划:使用https://msdn.microsoft.com/en-us/library/ms181091(v=sql.100).aspx:它不仅可以帮助您找到瓶颈,还可以教您DB优化器如何使用不一致。