SQL Server 存储过程包含 SQL 或调用查看

Posted

技术标签:

【中文标题】SQL Server 存储过程包含 SQL 或调用查看【英文标题】:SQL Server stored procedures contain SQL or call to view 【发布时间】:2011-03-28 21:46:46 【问题描述】:

在 SQL Server 存储过程中引用视图而不是视图包含的 SQL 代码是否更好?

我看到很多类似的代码:

ALTER PROCEDURE [dbo].[Report_65PlusLivingAlone]

As
Begin

---- Select all 3 groups from base table
Select 
    * 
INTO 
    #Temphouseholds
FROM
(
select  b.ReportYearDescription as CensusYear
        , Case When a.AggregationLevel = 'Minnesota' then 'Statewide'
               Else a.AggregationLevel
          End as AggregationLevel
        , a.PopulationType
        , a.PopulationSize
        , Case When a.PopulationType in 
                    ('Non-Family Households, Living Alone, Age 65 +'
                        ,'Living alone, age 65 and older') then 'households_livingalone'
                When a.PopulationType = 'Householders age 65 and older' then 'householders_65plus'
                Else 'total_households'
          End as PopulationGroups
        , Case  When b.ReportYearType = 'C'
                Then 'Current'
                Else 'Projected'
          End as censusgroups   
from    PublicReport_DSD.dbo.HouseholdCensusCountyInformation a
        , PublicReport_DSD.dbo.ReportYear b
where   a.PopulationType in ('Non-Family Households, Living Alone, Age 65 +'
                             ,'Living alone, age 65 and older'
                             ,'Householders age 65 and older'
                             ,'Total'
                            )
        and cast(a.CensusYear as varchar) = b.ReportYearDescription
        and b.ReportID = 18
        and b.IsActive = 1
) as Temphouseholds

我想重写以便 SQL 在视图中。 视图是否会增加开销,或者像我怀疑的那样,它是否会为服务器提供有关 sp 正在做什么的更多信息,以便更好地优化 sp?

感谢您的信息,

-贝丝

【问题讨论】:

【参考方案1】:

Sql Server 优化器可能(t-sql 通常是可能的情况)对待两个查询相同 - 除非有额外的 t-sql 代码、提示或 SARG,否则视图不会为编译器提供任何额外的东西。除非视图被正确索引it may indeed perform worse。

【讨论】:

这篇文章很好,虽然你应该特别害怕 cmets,因为性能问题并没有具体的例子来支持。视图也可以帮助您创建更好的代码。因此,除非您的数据库确实存在性能问题,否则我会集中精力解决业务问题。 @gjvdkamp 那篇文章中的 cmets 很有趣。视图没有问题 - 它们可以使 sql 代码更具可读性并抽象出业务逻辑(根据我的经验,它们的性能也比函数更好),如果它们被索引,视图可以具有更高的性能,但我认为 OP 期望视图会给优化器提示(因此更快),无需任何更改 - 它不会。 我为安全层使用了很多视图,它们非常复杂。经过一些调整后完美运行,不要认为它可以更快。如果你坚持这个观点,即使是更新,你也可以确保你永远不会破坏安全性。尝试将所有这些连接手动编码到每个过程中。所以仔细想想,我完全不同意作者的看法。我怀疑是否存在可衡量的性能影响,它们允许您创建一个可以编写代码的层。所以我认为意见,除非你真的有问题。 @gjvdkamp 关于安全性的好点,也视图执行更好的 DRY 规则。 @Beth,我们达成协议。看风景!

以上是关于SQL Server 存储过程包含 SQL 或调用查看的主要内容,如果未能解决你的问题,请参考以下文章

用ASP调用SQL Server的视图和存储过程

SQL Server存储过程简介

SQL Server通过条件搜索获取相关的存储过程等对象

SQL server T-SQL存储过程

sql server 中 一个要输入参数和输出参数的存储过程。

sql server 存储过程如何调用存储过程