Sql server 使用存储过程执行选择、更新、插入的任何禁忌
我使用一个SP执行所有CRUD操作Sql server 使用存储过程执行选择、更新、插入的任何禁忌,sql-server,performance,stored-procedures,Sql Server,Performance,Stored Procedures,我使用一个SP执行所有CRUD操作 因此,基本上我是在执行同一个SP,具体取决于所需的操作: 乙二醇 感谢我每1个business对象只有1个SP,这使我的数据库保持有序。 但最近我遇到了性能问题。 鉴于我的问题: 这种方法正确吗?它是否会对性能/正确执行产生影响。计划?由于可能缓存“错误”的查询计划,它可能会影响性能。查看主题和 编辑:为了回应John的评论,您还可以让顶级SP决定调用哪个CRUD SP,然后每个SP都将获得自己的缓存查询计划。由于可能缓存“错误”的查询计划,这可能会影响性能。
因此,基本上我是在执行同一个SP,具体取决于所需的操作: 乙二醇 感谢我每1个business对象只有1个SP,这使我的数据库保持有序。 但最近我遇到了性能问题。 鉴于我的问题:
这种方法正确吗?它是否会对性能/正确执行产生影响。计划?由于可能缓存“错误”的查询计划,它可能会影响性能。查看主题和
编辑:为了回应John的评论,您还可以让顶级SP决定调用哪个CRUD SP,然后每个SP都将获得自己的缓存查询计划。由于可能缓存“错误”的查询计划,这可能会影响性能。查看主题和
编辑:为了回应John的评论,您还可以让顶级SP决定调用哪个CRUD SP,然后每个SP都会得到自己的缓存查询计划。我认为这更像是一个编码/设计首选项问题 就我个人而言,我非常喜欢保持简单,因此我建议您将操作分解为单独的存储过程
这将更加透明,也有助于您将来可能必须进行的任何性能调整,即,如果您的更新过程/逻辑执行缓慢,您可以立即将其作为原因隔离,而如果逻辑是具有不同CRUD操作的更大过程的一部分,问题的根本原因不会那么明显。我认为这更像是一个编码/设计偏好问题 就我个人而言,我非常喜欢保持简单,因此我建议您将操作分解为单独的存储过程
这将更加透明,也有助于您将来可能必须进行的任何性能调整,即,如果您的更新过程/逻辑执行缓慢,您可以立即将其作为原因隔离,而如果逻辑是具有不同CRUD操作的更大过程的一部分,这个问题的根本原因不会那么明显。我也喜欢简化(如果可能的话) 但我决定这样做的原因是:如果我将所有SP按其提供的功能(例如USP_示例_插入、USP_示例_选择1、USP_示例_选择2、, USP_样本_删除)我将有约400个SPs 在如此庞大的SP实例之间管理、导航、更新和同步参数对我来说简直是噩梦
对我来说,唯一合理的做法是性能…我也喜欢简化(如果可能的话) 但我决定这样做的原因是:如果我将所有SP按其提供的功能(例如USP_示例_插入、USP_示例_选择1、USP_示例_选择2、, USP_样本_删除)我将有约400个SPs 在如此庞大的SP实例之间管理、导航、更新和同步参数对我来说简直是噩梦
对我来说,唯一合理的做法是性能…Hi Mitch,我认为在SQL 2005及更高版本中,存储过程中的每个批处理/状态都有自己的执行计划?这是为了帮助重新编译,以便在必要时只重新编译特定步骤,而不是整个过程?……因此,参数嗅探肯定会成为所有存储过程的潜在问题,而不仅仅是具有多种crud操作类型的存储过程?@John Sansom:这是正确的。海报暗示他的一个SP执行所有操作。@Mitch:谢谢你的澄清!您好,Mitch,我认为在SQL 2005及更高版本中,存储过程中的每个批处理/状态都有自己的执行计划?这是为了帮助重新编译,以便在必要时只重新编译特定步骤,而不是整个过程?……因此,参数嗅探肯定会成为所有存储过程的潜在问题,而不仅仅是具有多种crud操作类型的存储过程?@John Sansom:这是正确的。海报暗示他的一个SP执行所有操作。@Mitch:谢谢你的澄清!
-- for select
exec USP_ORDER @MODE='S', @ORDER_DATE='2009/01/01'
-- for update
exec USP_ORDER @MODE='U', @other_params
-- for insert
exec USP_ORDER @MODE='I', @other_params
-- for delete
exec USP_ORDER @MODE='D', @ID=100