我们的某些表与其他表具有动态关系。
例如,我们有一个地址表来存储所有地址,其中有两个“链接”字段,entity_id和entity_key_id,用于将地址链接到其他表。
例如,“成员”可能是entity_id 1,“组织”可能是实体id 2,因此,如果我们要存储成员地址,则该行将具有entity_id = 1和entity_key_id = mem_id(mem表的pk),但是如果我们正在存储组织地址,则该行将具有entity_id = 2,entity_key_id将存储组织表的pk)。
我将如何最好地对此进行索引?我是否应该有2个索引-一个用于entity_id,一个用于enterity_key_id?还是将两个列都包含在一个索引中会更好,如果这样,按什么顺序?
该数据库是SQL Server 2008 R2
这取决于您要针对该数据库运行的查询。您可以使用Tuning Adviser(https://msdn.microsoft.com/zh-cn/library/ms166575 ( v=sql.100 ) .aspx),它会有所帮助。
但是通常,您应该为谓词(WHERE
)和选择的列按顺序对各列进行索引。这里有些例子。
SELECT ... from table1 where table1.column1=.. and table1.column2=..
。
在这里您应该有column1, column2
索引,因此DB将能够首先找到所有索引column1
,然后column2
直接从索引中查找所有索引。您可能也有column1
索引,但是在这种情况下,数据库将首先column1
从索引中读取,然后进入表本身,这比较慢。
但是,如果您有column2, column42, column1
索引,则该索引将不被使用,因为数据库无法满足您的WHERE
条件。
在索引中包含列也很好。
select column1 from table1 where column2=...
与index一起运行column2, column1
将使DB能够从index中读取两列,甚至不需要触摸表!很快 但是,如果您更改此索引中的顺序,则在DB需要时column2
(根据WHERE
)将不会使用该顺序。
您应该始终通过探查器来获取执行计划:使用https://msdn.microsoft.com/zh-cn/library/ms181091(v=sql.100).aspx:不仅可以帮助您找到瓶颈,而且可以教您如何DB优化器使用不确定性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句