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 或调用查看的主要内容,如果未能解决你的问题,请参考以下文章