哪一个是sql server中用于数据访问目的的最佳查看或存储过程

时间:2011-05-06 04:25:37

标签: sql-server stored-procedures

我经常使用存储过程进行数据访问,但不知道哪一个是最佳视图或SP。

存储过程和视图都已编译,执行计划保存在数据库中。所以请告诉我哪一个最适合数据访问目的,为什么最好列出原因请。

我搜索谷歌知道哪一个是最好的,但没有得到预期的答案。

3 个答案:

答案 0 :(得分:12)

在涉及存储过程时,我不同意Jared Harding,导致应用程序更新变得更加困难。更新存储过程要比更新应用程序代码容易得多,这可能需要重新编译,并要求您将用户踢出系统进行更新。如果在存储过程中编写所有SQL,则可能只需要将应用程序的更新频率降低一半。并且可以更新存储过程而不会中断用户。

我强烈建议在应用程序代码中编写的视图或SQL上使用存储过程。使用参数化存储过程(使用构建为字符串的动态SQL并使用安全sp_executesql函数调用),您可以编写单个存储过程来选择可在多个应用程序和报表中使用的数据。除非您确实需要阻止对基础表的权限,否则几乎不需要使用视图。在存储过程中创建基本SELECT查询然后使用参数选项来更改结果的过滤方式要好得多。例如,每个参数都可以为WHERE子句添加不同的行。通过不传递任何参数,您将获得完整的未过滤记录集。只要您需要通过不同的字段过滤结果,您只需要在该过程中添加一个参数和一行代码,然后让任何需要使用它的应用程序传入参数。通过将存储过程参数默认为null,您不必更改为其他目的调用该存储过程的任何应用程序。

答案 1 :(得分:3)

视图和存储过程完全不同。视图是一种方便的方式,可以将复杂的关系集(例如连接多个表的关系集)作为平面表引用,而不会实际强制显示数据。您使用视图来清理SQL代码。您的存储过程可以调用视图。视图通常用于权限控制。您可以授予数据库用户对视图的访问权限,而无需授予他们对基础表的访问权限。这将授予用户对视图中列的列级权限,这是一种更为精细的权限控制方法,而不是授予对整个表的访问权限。

存储过程用于将常用功能作为一个整体保存在一起。说实话,SP在许多程序员中失宠。虽然你是正确的,SP已经缓存了他们的执行计划,但动态SQL自SQL Server 2000以来已经有了执行计划缓存(我相信这是正确的版本)。通过使用SP获得的唯一速度增益是通过网络发送更少的数据,而且这将是非常小的。 SP往往会使代码更加脆弱,并且当应用程序更改无法保证时,需要更改数据库。例如,如果您只想更改要选择的行的条件。使用SP,您将不得不将更改滚动到应用程序和数据库代码。如果您使用的是动态SQL或ORM工具,则只需对应用程序进行更改即可简化部署。 SP绝对有时间和地点,但它们不一定是您与数据库交互的唯一方法。

此外,如果您担心性能,可以实现视图,从而减少重复查询基础表的需要。如果您觉得需要在实现视图导致的插入/更新上添加额外开销,这可以极大地提高您的性能。

答案 2 :(得分:1)

要加快查询速度,您需要在表上正确定义索引。在存储过程中,您可以使用参数,实现您自己的逻辑,但是在视图中您不能

因为:编译过程后,即使我们在相关表中插入新数据,也会在每次调用它时制定执行计划并使用相同的程序,直到我们对程序代码进行任何更改。

每次调用时都会查看新的更新数据。

您可以使用SP进行整个交易处理等。