代码之家  ›  专栏  ›  技术社区  ›  CSharpAtl

存储过程的缺点

  •  19
  • CSharpAtl  · 技术社区  · 16 年前

    希望获得使用存储过程的优点和缺点列表。SPS的主要优点似乎是预编译和从应用程序中提取数据。把你的想法告诉我……

    19 回复  |  直到 16 年前
        1
  •  11
  •   Ryan Lundy    15 年前

    更正:是否预编译取决于数据库。例如,在SQL Server中,它们不是。存储过程和参数化SQL都是在运行之前编译的。如果存在相应的执行计划,存储过程有时可以重用执行计划…但参数化SQL也是如此。

    编辑: Here's what MSDN says about it :

    SQL Server 2000和SQL Server 7.0版包含了对语句处理的一些更改,这些更改将存储过程的许多性能优势扩展到了所有SQL语句。创建存储过程时,SQL Server 2000和SQL Server 7.0不会保存部分编译的存储过程计划。与任何其他Transact-SQL语句一样,在执行时编译存储过程。SQL Server 2000和SQL Server 7.0保留过程缓存中所有SQL语句的执行计划,而不仅仅是存储过程执行计划。

        2
  •  33
  •   ckarras    15 年前

    优势 :为数据库(另一个抽象层)提供“公共接口”。

    同时,将所有查询分组在同一位置,使DBA更容易了解如何查询数据库并相应地对其进行优化。

    缺点 :可能不是放置复杂逻辑的最佳位置。但是,遵循复杂逻辑属于应用程序代码而不是存储过程的思想,存储过程变成了简单的CRUD操作(每个表都有一个“创建”、“读取”、“更新”和“删除”过程)。在这种情况下,存储过程不会为应用程序增加任何价值,它们只会使维护复杂化并成为浪费。

    查询都被分组在一起,因此很难看到使用它们的应用程序的上下文。分析变更的影响时间更长,进行变更的时间也更长。

    因此 :使用存储过程封装复杂查询(复杂联接、复杂WHERE子句…)。但不要将存储过程用于复杂的应用程序/域/业务逻辑,也不要将存储过程用于CRUD。因此,存储过程应该在少数情况下使用,而不是作为应用程序中所有查询的标准工具。

    分组代码(包括查询)以实现“功能内聚”,而不是通过工具/技术进行分组。要允许DBA根据查询方式优化数据库,请使用探查器。

        3
  •  10
  •   DCNYAM    16 年前

    通过使用SP,还可以避免让用户直接访问表。所有访问都可以通过SPS进行控制。

        4
  •  6
  •   marc_s Hady Salah    8 年前

    缺点

    • 重构更难。重命名或更改存储过程的位置可能会产生不良影响。

    • 单元测试存储过程需要数据库外部的代码帮助

    优势

    • 您不需要部署来进行更改。
    • 快一些
    • 更容易扩展系统
        5
  •  5
  •   Vin    16 年前

    对于当前的.NET 3.5框架库,我将使用LINQ执行大多数数据库操作。在某些地方,sp可能更有意义。但Linq也有运行SP的规定。

    关于SP的缺点,请查看以下链接-一个有趣的分析。也可以查看博客文章的评论。

    http://www.spoiledtechie.com/post/Whats-up-with-Stored-Procedures-these-days.aspx

        6
  •  5
  •   Steve    16 年前

    优点:存储过程可用于维护数据完整性和强制执行数据库策略,而无需依赖外部程序。

    缺点:可以使调试更加复杂。如果操作不正确,也会对在复制操作期间被丢弃敏感。

        8
  •  4
  •   yogman    16 年前

    另一个缺点是版本控制,因为一些业务逻辑现在在数据库端。你能轻松地从v2(现在)回滚到v1(一年前)吗?

    一个可行的解决方案是对存储过程名称进行版本控制。但现在,数据库中的旧存储过程和新存储过程一团糟。

        9
  •  4
  •   Martynnw    15 年前

    缺点

    • 源代码管理可能会很痛苦。
    • 调试很困难。
    • 如果您在procs中有很多功能,它将使不同数据库系统之间的交换变得更加困难——如果您想支持不同的数据库系统,它还将创建更多的工作。
    • 开发存储过程可能是一项相当专业的任务,特别是当它们变得更加复杂时。
        10
  •  3
  •   Jeff Jones    16 年前

    在构建应用程序时仅使用存储过程的几个原因:

    • 存储过程可以是应用程序和基础数据库之间的接口。这样,数据库所在的服务器(通常比台式机更强大)可以用来执行更复杂的过程。
    • 如果需要更改数据库的结构,则可以在不中断应用程序的情况下进行更改(如果将存储过程用作接口)。
    • 在编写过程中,存储过程包含预编译和预测试的SQL。
    • 使用存储过程执行复杂操作比使用客户机或GUI生成的SQL更容易。
        11
  •  2
  •   Michael L Perry    16 年前

    优点:DBA可以添加应用程序不关心的行为。例如,在每行存储修改日期。

        12
  •  2
  •   David Aldridge    16 年前

    优势:您的数据库相关代码更有可能是由对数据库工作感兴趣和熟练的人员编写的。

        13
  •  2
  •   Clinton    12 年前

    与在应用程序代码中编写相同的逻辑相比,使用存储过程的优势在于它可以减少应用程序对数据库的调用次数。

    存储过程可以接受其参数并根据这些参数做出不同的决定和操作,而不是将结果返回给应用程序,然后应用程序做出决定并决定需要执行另一个操作并进行另一个数据库调用。

    性能上的瓶颈几乎总是进程间通信。我尽量减少对数据库的调用。

        14
  •  1
  •   Michael L Perry    16 年前

    优点:操作团队有一个钩子来监视或修复生产中的问题。

        15
  •  1
  •   Rayar    15 年前

    优点:sp用于执行一组SQL语句。 缺点:调试比较复杂

        16
  •  1
  •   Alan Savage    13 年前

    另一个优势是在大型企业环境中,您可以拥有多个使用数据库的客户机应用程序和环境(如Web、桌面、分布在不同操作系统上的报告工具)。对于某些业务规则更改,可以在数据库中进行更改,这在所有环境中都是有效的。

        17
  •  0
  •   Ajay    16 年前

    优势-

    1. 在一个地方组织(不撒在代码上)
    2. 比动态查询快得多
        18
  •  0
  •   Martijn Pieters    12 年前

    它增加了服务器上的负载。如果其他应用程序或多个应用程序正在使用同一数据库服务器,则速度会变慢。

        19
  •  0
  •   Mohamad Reza Taghipour    9 年前

    简单的答案如下: 它是封装T-SQL代码的最强大的结构。 它不仅限于选择,而且支持所有DML代码。 它提供接收输入和直接返回输出。

    dis:无法在select中调用它,因此无法运行它 几条记录。