C# 存储过程不和

C# 存储过程不和,c#,database,performance,stored-procedures,orm,C#,Database,Performance,Stored Procedures,Orm,可能重复: 我正在听一位来宾(Sam Saffron和Rob Conry)概述DBA坚持使用存储过程的经典原因: 它们是预编译的,这使它们具有执行速度优势 它们隐藏了底层数据库方案,该方案允许分离接口和实现,以防止脆弱性 一位来宾接着说,这些都不是很好的论据,并建议DBA坚持使用存储过程的真正原因是因为他们只是想保护自己不受中间层开发人员的忽视 我发现这句话有点极端。当然,我可以同意论点#2是有缺陷的,但我认为众所周知,向数据库发送任意(未编译的)SQL会对性能造成影响。我是否遗漏了一些东西来

可能重复:

我正在听一位来宾(Sam Saffron和Rob Conry)概述DBA坚持使用存储过程的经典原因:

  • 它们是预编译的,这使它们具有执行速度优势
  • 它们隐藏了底层数据库方案,该方案允许分离接口和实现,以防止脆弱性
  • 一位来宾接着说,这些都不是很好的论据,并建议DBA坚持使用存储过程的真正原因是因为他们只是想保护自己不受中间层开发人员的忽视

    我发现这句话有点极端。当然,我可以同意论点#2是有缺陷的,但我认为众所周知,向数据库发送任意(未编译的)SQL会对性能造成影响。我是否遗漏了一些东西来解释为什么论点1不是真的


    我自己的答案,只是猜测,是有一个性能的打击-但它很少有关系。这可能类似于开发人员试图优化他编写的每个循环,即使编写的循环中只有1%受益于调优。我的想法正确吗?

    根据我的经验,大多数DBA都不能再编写存储过程,而只能驾驶航天飞机。无论我在哪里工作,存储过程都是由应用程序开发人员编写的,他们也设计和实现了数据库

    话虽如此,存储过程并不是天生就比使用(比如视图)更快,如果由没有经验的开发人员使用游标之类的东西编写,则可能确实会更慢。

    “但我认为,向数据库发送任意(未编译)SQL是一个众所周知的性能问题。”

    自sql 6.5以来,您在预编译方面对存储过程和其他sql语句所做的区分就不存在了

    存储过程和执行计划

    在SQL Server 6.5及更低版本中, 存储过程是一种 部分预编译执行 计划。在存储过程 创建了一个部分编译的 执行计划存储在一个系统中 桌子执行存储过程 比执行 SQL语句,因为SQL Server 不必编制执行计划 完全地,它只需要完成 优化存储的计划以用于 程序此外,该报告已全面汇编 存储系统的执行计划 过程保留在SQL数据库中 服务器过程缓存,这意味着 存储的数据的后续执行 过程可以使用预编译的 执行计划

    SQL Server 2000和SQL Server版本 7.0对语句处理进行了大量更改,扩展了许多 存储系统的性能优势 所有SQL语句的过程SQL 服务器2000和SQL Server 7.0不支持 将部分编译的计划保存为 当存储过程 创建。存储过程是 在执行时编译,就像任何 其他Transact-SQL语句。SQL Server 2000和SQL Server 7.0 所有SQL语句的执行计划 在过程缓存中,而不仅仅是 存储过程执行计划。这个 数据库引擎使用高效的 一种比较新算法 带有 现有数据库的Transact-SQL语句 执行计划。如果数据库 引擎确定新的 Transact-SQL语句与 现有数据库的Transact-SQL语句 执行计划,它重用计划。 这会降低相对性能 预编译存储的好处 扩展执行计划的程序 重用所有SQL语句


    至于性能:使用存储过程或预编译语句

    至于抽象:使用DAL/ORM或存储过程


    当然,存储过程可以做一些您在外部无法做的事情,并且具有这种性能。所以像往常一样,这要视情况而定

    是的,这个。过去确实,临时查询没有预先编译或以其他方式进行优化。那场争论很久以前就消失了。我的愤世嫉俗的观点是,DBA只是不想将任何控制权或工作安全性拱手让给应用程序开发人员。