我有一个名为Protocol的表,一个名为Eligibility的表,以及一个将两者映射在一起的Protocol_Eligibilty表(多对多关系)。如果我想在Protocol表中创建一个条目的完美副本,并在Protocol_Eligibility表中创建所有需要的映射,那么从性能的角度来看,使用SQL视图会有帮助吗?协议将有大约1000行,资格将有大约200,我希望每个协议映射到大约10个Eligibility行和每个Eligibility映射到Protocol中超过100行。
以下是我如何使用视图执行此操作:
var pel_original = (from pel in _documentDataModel.Protocol_Eligibility_View
where pel.pid == id
select pel);
Protocol_Eligibility newEligibility;
foreach (var pel_item in pel_original)
{
newEligibility = new Protocol_Eligibility();
newEligibility.Eligibility = (from pel in _documentDataModel.Eligibility
where pel.ID == pel_item.eid
select pel).First();
newEligibility.Protocol = newProtocol;
newEligibility.ordering = pel_item.ordering;
_documentDataModel.AddToProtocol_Eligibility(newEligibility);
}
这是没有观点的:
var pel_original = (from pel in _documentDataModel.Protocol_Eligibility
where pel.Protocol.ID == id
select pel);
Protocol_Eligibility newEligibility;
foreach (var pel_item in pel_original)
{
pel_item.EligibilityReference.Load();
newEligibility = new Protocol_Eligibility();
newEligibility.Eligibility = pel_item.Eligibility;
newEligibility.Protocol = newProtocol;
newEligibility.ordering = pel_item.ordering;
_documentDataModel.AddToProtocol_Eligibility(newEligibility);
}
答案 0 :(得分:3)
视图在SQL Server中没有性能影响。从视图中进行选择或从视图所基于的查询中进行选择,在每个方面都是相同的。实际上,在构建查询计划时,视图展开到其定义中。
视图影响性能的唯一时间是存在索引视图,或者在Oracle中调用实例化视图时。但索引视图性能增益来自索引,而不是来自视图。实际上,从任何可以利用索引视图的查询中选择将利用它,而不仅仅是从视图中进行选择。非企业版(标准版,快速版)不考虑索引视图。
事实上,每当讨论SQL Server或任何关系数据库中的性能问题时,问题永远都不是关于如何设计查询,queiston总是关于如何设计架构。适当的聚簇索引和适当的非聚集索引,这将提供性能,而不是视图。
我在响应中没有提到linq,也没有提到MVC,也没有提到ASP,这只是因为在讨论SQL性能时完全不相关。
答案 1 :(得分:1)
如果行数很小,性能优化在现代桌面或服务器硬件上不会产生任何明显差异。除非这是一个极其受限资源的嵌入式系统,否则最好将开发时间分配到其他地方。