Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在存储过程中使用视图而不是表?_Sql_Database_Database Design_Stored Procedures_Views - Fatal编程技术网

Sql 在存储过程中使用视图而不是表?

Sql 在存储过程中使用视图而不是表?,sql,database,database-design,stored-procedures,views,Sql,Database,Database Design,Stored Procedures,Views,在存储过程中查询视图而不是原始表是一种好做法吗?(即使视图没有提供任何不同的数据) 我一直认为这可能是个好主意,因为它是一个额外的抽象层,类似于在类函数中使用属性而不是成员变量 但是现在我正在研究由ASP.NET成员资格提供程序创建的存储过程,它们总是直接查询表 我知道在使用视图时无法轻松插入数据,但如果存储过程仅查询数据,是否仍应直接使用表?如果是,主要原因是什么?(性能?不同的数据库优化器以不同的方式优化查询,因此这不是一个简单的答案。但是一般来说,添加抽象层会阻止优化器正确使用索引 在Sq

在存储过程中查询视图而不是原始表是一种好做法吗?(即使视图没有提供任何不同的数据)

我一直认为这可能是个好主意,因为它是一个额外的抽象层,类似于在类函数中使用属性而不是成员变量

但是现在我正在研究由ASP.NET成员资格提供程序创建的存储过程,它们总是直接查询表


我知道在使用视图时无法轻松插入数据,但如果存储过程仅查询数据,是否仍应直接使用表?如果是,主要原因是什么?(性能?

不同的数据库优化器以不同的方式优化查询,因此这不是一个简单的答案。但是一般来说,添加抽象层会阻止优化器正确使用索引

在Sql Server中,如果有where子句包含以下调用:

  • 是空的
  • 比如说“%某物”
  • 不存在
它使它成为一个查询,即一个不使用索引的查询,或者以次优方式使用索引

我猜使用视图也会影响特区政府。我将去测试这个(在Sql Server中)-我将在5分钟后回来

编辑

我猜答案是“这取决于”并且您需要打开查询执行计划以确保,我所做的以下测试显示了基于表查询简单视图和简单查询基础表之间没有区别。但它需要进一步测试,因为复杂的视图可能会有不同的表现


在以下两种情况下,我在存储过程中使用了视图:

1-用于多个过程中需要的复杂联接或条件


2-替换重命名的表。例如,我有两个表,分别称为“member”和“non_member”。后来,我决定将它们合并到一个“用户”表中。为了避免修改我曾经编写的每个进程,我创建了名为“member”和“non_member”的视图,它们使用where子句适当地过滤“user”表。所有程序都像以前一样运行,没有任何更改。当我有时间时,我可以将它们更改为直接访问新表。

视图只是一个扩展为外部查询的宏

如果您的视图包含多个联接,那么当您将If联接到其他视图时,当您在存储过程的SQL中实际看到3个联接时,您会突然有一个20或30路联接。您还会发现每个查询都是不同的:为什么每次查询都要连接相同的20或30个表

通常,除非视图被索引/具体化,并且优化者可以使用它,否则没有任何好处

诸如在单个表上由视图屏蔽的计算应该在计算列中:为什么要继续计算它?对于一个视图中多个表上的计算,应为其编制索引

使用存储过程已经意味着没有基表访问(所有权链接)

视图的良好用途是避免用户直接访问表,或屏蔽模式更改,或提供一些基本的安全性(例如基于SUSER_SNAME),但不是为了性能或思想(至少在SQL Server中),我的理解是存储过程是在编译时优化的,因此,总体上比视图更有效。我不确定,但我怀疑,通过对视图执行SPRC,您可能会丢失通过这种方式获得的任何优化

此外,为什么?正如前面的海报所建议的那样,如果所包含的一个或多个视图本身由多个联接组成,那么执行的联接可能比需要的要多,这一点并不明显

另外,我的理解是,使用视图的主要原因之一是以用户可以使用的格式显示表数据,同时保护表数据不受意外更改的影响。由于存储过程的结果集不受插入和更新的约束,因此这一点没有意义

由于设计的存储过程接受参数,不允许用户直接与表数据交互,并且可以执行您可能在视图中使用的任何查询逻辑(以及更多),因此在我看来(除了一些例外)这样做的主要原因是使编码更容易,以性能和可维护性为潜在成本(如果有人更改了其中一个视图,而没有意识到您的存储过程依赖于它怎么办?)

我建议将其全部编码到存储过程中,除非有令人信服的理由这样做

“我会去测试这个(在Sql Server中)-我会在5分钟后回来。”-嘿,很酷,谢谢。我就在这儿等D