Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询中包含重复联接的联合查询中,创建视图还是在每个查询中重复联接更好_Sql_Sql Server - Fatal编程技术网

Sql 在查询中包含重复联接的联合查询中,创建视图还是在每个查询中重复联接更好

Sql 在查询中包含重复联接的联合查询中,创建视图还是在每个查询中重复联接更好,sql,sql-server,Sql,Sql Server,我有一个联合查询,它将多个select查询联合在一起。每个select查询都针对所有具有地址信息的实体。因此,每个select语句都有相同的内部联接来获取地址、状态等。我的问题是,在每个select语句中重复这些连接是否更有效,还是应该先创建一个view/temp表,然后在每个select查询中引用它。这是我现在所拥有的,它正在为每个地址中的地址信息重复连接 Select 'Individual' As OwnerType, Horizon.Id as HorizonId, Ownership.

我有一个联合查询,它将多个select查询联合在一起。每个select查询都针对所有具有地址信息的实体。因此,每个select语句都有相同的内部联接来获取地址、状态等。我的问题是,在每个select语句中重复这些连接是否更有效,还是应该先创建一个view/temp表,然后在每个select查询中引用它。这是我现在所拥有的,它正在为每个地址中的地址信息重复连接

Select 'Individual' As OwnerType, Horizon.Id as HorizonId, Ownership.Id As OwnershipId, Ownership.OwnershipPercentage, (PersonDetails.FirstName + ' ' + PersonDetails.LastName) As Name, Address.AddressLine1, Address.AddressLine2, Address.City, Address.ZipCode, State.Abbreviation as State
        From Horizon
        Inner Join Ownership On Horizon.Id = Ownership.HorizonId
        Inner Join OwnerXRef On Ownership.Id = OwnerXRef.OwnershipId
        Inner Join OwnerIndividual On OwnerXRef.IndividualId = OwnerIndividual.Id
        Inner Join PersonDetails On OwnerIndividual.IndividualPersonDetailsId = PersonDetails.Id
        Inner Join PersonDetailsAddressXRef On PersonDetails.Id = PersonDetailsAddressXRef.PersonDetailsId
        Inner Join Address On PersonDetailsAddressXRef.AddressId = Address.Id
        Inner Join State On Address.StateId = State.Id

    UNION All

    Select 'Business' As OwnerType, Horizon.Id as HorizonId, Ownership.Id As OwnershipId, Ownership.OwnershipPercentage, OwnerBusinessEntity.Name As Name, Address.AddressLine1, Address.AddressLine2, Address.City, Address.ZipCode, State.Abbreviation as State
        From Horizon
        Inner Join Ownership On Horizon.Id = Ownership.HorizonId
        Inner Join OwnerXRef On Ownership.Id = OwnerXRef.OwnershipId
        Inner Join OwnerBusinessEntity On OwnerXRef.BusinessEntityId = OwnerBusinessEntity.Id
        Inner Join Address On OwnerBusinessEntity.AddressId = Address.Id
        Inner Join State On Address.StateId = State.Id

    UNION All

    Select 'Gov-BLM' As OwnerType, Horizon.Id as HorizonId, Ownership.Id As OwnershipId, Ownership.OwnershipPercentage, OwnerBureauOfLandManagement.RegionalOffice As Name, Address.AddressLine1, Address.AddressLine2, Address.City, Address.ZipCode, State.Abbreviation as State
        From Horizon
        Inner Join Ownership On Horizon.Id = Ownership.HorizonId
        Inner Join OwnerXRef On Ownership.Id = OwnerXRef.OwnershipId
        Inner Join OwnerBureauOfLandManagement On OwnerXRef.BureauOfLandManagementId = OwnerBureauOfLandManagement.Id
        Inner Join Address On OwnerBureauOfLandManagement.AddressId = Address.Id
        Inner Join State On Address.StateId = State.Id

    UNION All

    Select 'Trust' As OwnerType, Horizon.Id as HorizonId, Ownership.Id As OwnershipId, Ownership.OwnershipPercentage, OwnerTrust.TrustName As Name, Address.AddressLine1, Address.AddressLine2, Address.City, Address.ZipCode, State.Abbreviation as State
        From Horizon
        Inner Join Ownership On Horizon.Id = Ownership.HorizonId
        Inner Join OwnerXRef On Ownership.Id = OwnerXRef.OwnershipId
        Inner Join OwnerTrust On OwnerXRef.TrustId = OwnerTrust.Id
        Inner Join Address On OwnerTrust.TrustAddressId = Address.Id
        Inner Join State On Address.StateId = State.Id
我的问题是,在每个连接中重复这些连接是否更有效 select语句,还是先创建视图/临时表,然后 在我的每个select查询中引用它

使用
视图
不会改变性能,因为
视图
在您的查询中展开,服务器将在内部使用相同的查询

使用
temp table
可能会有所帮助,但也可能会降低查询速度,这取决于数据分布。如果所有查询都从查询的重复部分使用相同的数据子集,则性能会有所提高,因为您只需将重复数据外接一次,但如果重复部分为所有4个查询提取不同的数据,则查询速度可能会变慢。我将试着用这个例子来解释:

假设你有一个数据库,其中存储了过去10年来全国以邮局为中心的数据。这是巨大的数据量。您只需要提取有关少数发件人的数据。4个部门希望提取其员工上月发送的所有邮件。因此,您有4个表,用于4个部门,其中包含每个部门的人员以及有关每个部门的其他详细信息,因此您需要编写4个不同的查询,但它们仅在有关特定部门的某些列中有所不同,其余的都是相同的,重复部分在发件人、收件人、文档和选项之间有一些连接。如果您首先连接这些表并将结果保存在临时表中,即使不是Tb,也需要一些Gb,并且需要很多时间才能完成,但是如果您进行4次不同的查询,每个查询将只返回一些行,因为部门很小


为了了解什么是最好的,您应该了解您的数据。如果每个查询在重复部分选择不同的行,并且您有适当的索引,那么最好使用4个不同的查询。相反,如果每个重复的部分都包含几乎相同的数据,那么最好将其提取一次,保存到临时表并在每个查询中使用它

我认为正确的答案是修复您的数据库架构。视图将更易于维护。谢谢Joe@罗伯特·哈维,我愿意接受建议。我在mssms中键入了修复数据库模式,但它没有做任何事情。。。模式是这样的,有几种类型的所有者,每种类型都有唯一的数据,所以我看到了要么创建一个包含大量列的所有者表,其中许多不适用于任何给定的所有者。或者为每种类型都有一个所有者表,每当我想同时查看所有所有者数据时,就必须处理联合查询。有更好的方法吗?你会问“使用视图或重复是否有效…”。嗯,在某个时刻你必须重复连接。视图将允许您将该逻辑封装在一个地方,从而提高可管理性(只要一致使用)。但这两种方法的效率是相同的。假设此信息实际上是静态的,您可以考虑一个物化(索引)视图。每个类型的视图也可能有用。但同样,没有人知道你是如何使用这些信息的。