我们的一些表与其他表有动态关系。
例如,- 我们有一个存储所有地址的地址表,其中有两个“链接”字段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
答案 0 :(得分:0)
更简洁的方法是拥有两个不同的键mem_key_id
和org_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优化器如何使用不一致。