多次查询同一个表

时间:2016-05-27 09:55:03

标签: sql sql-server-2012 query-optimization

当我需要在不同的列上引用相同的数据时,我总是使用多个连接。像这样:

select
    a.ContactName
    ,b.ContactName
    ,c.ContactName
from
    OrderBase as o
    left join ContactBase as a on o.contactid1 = a.ContactId
    left join ContactBase as b on o.contactid2 = b.ContactId
    left join ContactBase as c on o.contactid3 = c.ContactId

我一直认为这是非常低效的。加载表3次进行3次查找。有没有更有效的方法来做到这一点?我不是指编写代码,而是使用资源。 在SQL服务器的更高版本中是否有任何好的工具可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

第一个评论是存储相同的值是多列通常是一个可疑的模式。通常,这样的数据结构可以使用每个" OrderBase"一个" ContactId"。联结表并不总是最好的解决方案,但通常是。

至于你的查询:

select a.ContactName, b.ContactName, c.ContactName
from OrderBase as o left join
     ContactBase a
     on o.contactid1 = a.ContactId left join
     ContactBase b
     on o.contactid2 = b.ContactId left join
     ContactBase c
     on o.contactid3 = c.ContactId;

这特别需要ContractBase(ContactId, ContactName)上的索引。为此目的使用left join是完全合理的。

使用此索引,查询甚至不需要原始数据页面,因为索引"涵盖"查询 - 查询中的所有列都在索引中。您不必担心多次加载索引。虽然索引(或表)逻辑加载了三次,但称为页面缓存的东西可能会将页面保留在内存中,因此后续加载将非常快。