Sql server 如何最好地索引与其他表具有动态关系的表中的列?
我们的一些表与其他表具有动态关系 例如,我们有一个存储所有地址的地址表,其中有两个“链接”字段——实体_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?或者在一个索引中同时包含这两列会更好吗?如果是,顺序是什么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
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”