Sql server 如何最好地索引与其他表具有动态关系的表中的列?

Sql server 如何最好地索引与其他表具有动态关系的表中的列?,sql-server,indexing,Sql Server,Indexing,我们的一些表与其他表具有动态关系 例如,我们有一个存储所有地址的地址表,其中有两个“链接”字段——实体_id和实体_key_id,用于将地址链接到其他表 例如,“member”可能是entity_id 1,“organization”可能是entity id 2,因此如果我们存储一个成员地址,该行将具有entity_id=1和entity_key_id=mem_id(mem表的主键),但是如果我们存储一个organization address,该行的entity_id=2,entity_key

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

例如,我们有一个存储所有地址的地址表,其中有两个“链接”字段——实体_id和实体_key_id,用于将地址链接到其他表

例如,“member”可能是entity_id 1,“organization”可能是entity id 2,因此如果我们存储一个成员地址,该行将具有entity_id=1和entity_key_id=mem_id(mem表的主键),但是如果我们存储一个organization address,该行的entity_id=2,entity_key_id存储组织表的主键)

我如何最好地索引这个?我应该有两个索引吗?一个用于实体\u id,一个用于实体\u key\u id?或者在一个索引中同时包含这两列会更好吗?如果是,顺序是什么


db是SQL server 2008 R2

一种更干净的方法是使用两个不同的键
mem\u key\u id
org\u key\u id
。这不仅允许您为它们中的每一个创建索引,还允许您声明适当的外键约束


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

这取决于您将对此数据库运行的查询。您可以使用Tuning Adviser(),它会有所帮助

但通常情况下,您应该按照谓词(
,其中
)和所选列的顺序使用带有列的索引。这里有一些例子

选择。。。从表1开始,其中表1.column1=。。和表1。第2列=…

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

但是如果您有
column2、column42、column1
索引,则不会使用它,因为DB无法遵循您的
WHERE
条件

在索引中有列也很好

运行表1中的
select column1,其中column2=…
和索引
column2,column1
将使DB能够从索引中读取两列,甚至不接触表!它很快。但是,如果您更改此索引中的顺序,它将不会被使用,因为DB需要
第2列
(根据
WHERE


您应该始终探查器以获取执行计划:使用:它不仅可以帮助您找到瓶颈,还可以教您DB optimizer如何使用索引。

这就是这两种可能性,还是一种EAV类型的东西?过滤索引?但是如果您有50个entityID,您可能不想创建50个过滤索引。我同意@SeanLange这听起来很难说真的…OP似乎在问了一个问题后不久就逃走了。是的,它是EOV(我想-我不知道它的名字)。很抱歉擅离职守-这是我的第一个堆栈交换问题,所有的回答都会转到我的垃圾邮件文件夹。这两种可能性都是例子。这两种只是例子——任何数量的实体都可以在以后添加。我个人会使用联接表,但我没有设计一个模型。谢谢-我读了microsoft最佳实践文章,但对索引顺序有问题。运行select column1 from table1,其中column2=…和索引column2,column1将使DB能够从索引中读取两列,甚至不接触table!这很快。但如果您更改此索引的顺序,它将不会被使用,因为DB需要column2(根据where)这正是我要找的-我添加了索引“entity\u id,entity\u key\u id”